3

가능한 중복 동적 메모리 어레이의 시작 정렬 :
Aligned memory management?는 C에

를 I가 I이

int * myarray; 
int num_of_element; 

myarry = (int*) calloc(num_of_elements, sizeof(int)); 

등을 선언하고 배열 int의 크기는 4 바이트이지만 배열이 8 바이트 경계에서 시작되도록하고 싶습니다. 그래서 두 개의 값을 효율적으로로드 할 수 있습니다. e 시간. 내가 할 수있는 다른 방법이나 다른 것이 있습니까?

답변

2

여러 가지 방법이 있습니다.

  1. 오버 할당하고 반환 된 주소를 원하는 정렬로 반올림합니다.

  2. 정렬이 원하는 유형의 공용체를 정의합니다. 일반적으로 double입니다. 낮은 수준의 지식이 필요하지만 배열을 할당 할 때 최적이 아닙니다.

Also, you shouldn't cast the return value of malloc() in C.

+1

아무튼 ' calloc은 이미 반환 된 포인터가 tha를 포함하여 가능한 모든 유형과 정렬되어 있는지 확인합니다. t 두 배? –

+0

예, 적어도 BSD 및 Linux. @PiotrKalinowski – alk

1

posix_memalign을 사용해 보셨습니까?

posix_memalign 함수()는 size 바이트를 할당하고 *memptr에 할당 된 메모리의 어드레스를 놓는다. 할당 된 메모리의 주소는 alignment의 배수가되며 의 제곱 수와 sizeof(void *)의 배수 여야합니다.

예 :

if (posix_memalign(&myarray, 8, num_of_elements*sizeof(int)) != 0) { 
    // failed 
} 

참조 http://pubs.opengroup.org/onlinepubs/009696699/functions/posix_memalign.html

또한

리눅스 posix_memalign 맨 페이지 문서 aligned_alloc() (C11), memalign을() (구식) :

https://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html