比對的重要性大多描寫性能和便攜性。如果您不理解您使用的平臺的對齊要求,那麼您的代碼可能不一定能夠在那裏運行,或者只要有人將未正確對齊的代碼(或數據)移動到該平臺上,該代碼就會中斷。
根據的東西,如硬件和OS一些這方面爲您處理,但你要承擔一些罰款制動對齊規則。默認情況下,如果發生對齊錯誤,舊的Windows版本會用於崩潰進程,但今天Windows將能夠恢復,但需要花費額外的CPU週期。
對齊屬性是GCC的特殊功能來強制對齊(它無關,與C語言),排列在你的數據在內存中進行佈局什麼多一些數字。編譯器會在您的數據結構中插入垃圾,以確保您已經對編譯器施加的約束條件得到滿足。
讓我們在你的問題的例子:
struct data
{
int a __attribute__((aligned (8))) ;
char ch __attribute__((aligned (1))) ;
float s __attribute__((aligned (4))) ;
} ;
我們假設在這種情況下,我們的假想平臺都int
和float
本地大小爲4個字節。
最終的結構,在內存佈局將接近
struct data
{
int a; // 0x00
int junk0 // 0x04
char ch; // 0x08
char junk1[3] // 0x09
float s; // 0x0C
} ;
我不知道,如果編譯器將墊的第一個整數,所以它實際上佔據最終結構8個字節。它不會因爲填充而成爲64位,我覺得它很奇怪,因爲它會假設結構只放在64位地址上,所以在32位體系結構中,如果分配內存,只有在該內存對齊的地址是8的倍數是這樣的。也許這是爲了使它更便於攜帶,以確保它在64位上的行爲與32位相同。
編譯器可以選擇更加積極,實際上浪費了更多的空間,但有包指令,以打擊這一點。如果本地二進制兼容性對你來說真的很重要,那麼這些東西就很重要
那麼你必須在開始發佈問題之前閱讀FAQ! –