2010-10-22 109 views

回答

6

Alignment要求指定哪些地址偏移量可以分配給哪些類型。這完全取決於實現,但通常基於字大小。例如,一些32位體系結構要求所有變量都以4的倍數開始。在某些體系結構中,對齊要求是絕對的。在其他人(例如x86)上嘲諷他們只會帶來性能損失。

malloc需要返回適合任何對齊要求的地址。換句話說,返回的地址可以分配給任何類型的指針。從C99§7.20.3(存儲器管理功能):

指針返回如果分配成功 適當地對準,使得它 可以被分配給一個指向任何 類型的對象,然後用於訪問 這樣的對象或者這樣的對象的數組在分配空間中的對象(直到 空間被明確地解除分配)。

1

如果你有特別的記憶alignemnt需要(特定的硬件或庫),你可以檢查出非便攜式內存分配,如_aligned_malloc()memalign()。這些可以很容易地在「便攜式」界面後面抽象出來,但不幸的是非標準。

43

假設你有結構。

struct S { 
    short a; 
    int b; 
    char c, d; 
}; 

沒有對準,這將在內存中排列這樣(假設32位體系結構):

0 1 2 3 4 5 6 7 
|a|a|b|b|b|b|c|d| bytes 
|  |  | words 

的問題是,在某些CPU架構中,指令加載4內存中的字節整數僅適用於字邊界。所以你的程序必須用單獨的指令來獲取b的每一半。

但如果記憶被佈置爲:

0 1 2 3 4 5 6 7 8 9 A B 
|a|a| | |b|b|b|b|c|d| | | 
|  |  |  | 

然後訪問b變得簡單。 (缺點是需要更多的內存,因爲填充字節。)

不同的數據類型有不同的對齊要求。是很常見的char爲1字節對齊,short爲2字節對齊,以及4字節的類型(intfloat,和在32位的系統指針)是4字節對齊。

malloc是C標準所要求的,用於返回一個針對任何數據類型正確對齊的指針。

x86-64上的glibc malloc返回16字節對齊的指針。

+0

非常好的解釋,確實如此。 – AnyOneElse 2013-08-22 12:53:23

+0

很好的解釋。 – hagrawal 2016-01-31 22:36:35

+0

對不起,我不知道你的意思是什麼「char是1字節對齊,短爲2字節對齊和4字節類型」是常見的。 – 2016-11-19 07:42:30

1

malloc()文件說:

[...] the allocated memory that is suitably aligned for any kind of variable. 

這是在C很多要做的事情/ C++實現。但是,正如其他人所指出的,存在許多特殊情況並需要特定的對齊。例如,英特爾處理器支持256位類型:__m256,這肯定不會被malloc()考慮在內。類似的,如果你想爲要分頁的數據分配一個內存緩衝區(類似於mmap()等返回的地址),那麼你需要一個可能非常大的對齊,如果malloc()是返回始終與這些邊界對齊的緩衝區。

在Linux或其他Unix系統,我建議你使用posix_memalign()功能:

int posix_memalign(void **memptr, size_t alignment, size_t size); 

這是一個想要使用這種需求的最新功能。

相關問題