2012-09-18 78 views
3

可能重複:
Aligned memory management?對齊在動態存儲器陣列的開始用C

我有我聲明這樣

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雙重? –

+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

Linux的posix_memalign手冊頁也文檔aligned_alloc()(C11),包括memalign()(作廢):

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