我有我聲明這樣
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
的陣列一個int的大小是4個字節,但是我想確保我的數組在8字節的邊界上開始 - 所以我可以有效地加載兩個值e時間。有沒有其他方法或我可以做的其他事情?
我有我聲明這樣
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
的陣列一個int的大小是4個字節,但是我想確保我的數組在8字節的邊界上開始 - 所以我可以有效地加載兩個值e時間。有沒有其他方法或我可以做的其他事情?
有幾種方法。
過度分配並將返回的地址四捨五入到所需的對齊方式。
定義一個類型爲其所需的類型的聯合,一般爲double
。這需要低層次的知識,但在分配數組時不是最優的。
您試過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
Linux的posix_memalign手冊頁也文檔aligned_alloc()(C11),包括memalign()(作廢):
https://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html
隱而不宣」 calloc已經確保返回的指針與每種可能的類型對齊,包括tha雙重? –
是的,至少在BSD和Linux上。 @PiotrKalinowski – alk