2012-12-16 46 views
1

我見過這麼多的問題,在SO關於對齊屬性要求,但沒有在那裏我找到了優勢還是時使用的這個(我指的正是在這情況下,我們必須使用這個概念)任何一個人都可以清楚地看到它。只是複製一個程序從一個SO質疑一個程序對齊屬性引用對齊屬性

 
int main() 
{ 
    struct data 
    { 
     int a __attribute__((aligned (8))) ; 
     char ch __attribute__((aligned (1))) ; 
     float s __attribute__((aligned (4))) ;  
    } ; 
    struct data e ; 
    printf ("\n%u %u %u", &e.a, &e.ch, &e.s) ; 
    printf ("\n%d", sizeof (e)) ; 
    return 0 ; 
} 
+0

那麼你必須在開始發佈問題之前閱讀FAQ! –

回答

1

第一個用例是當你有一個char陣列,用來保存別的東西,那麼你需要的allign強制正確類型。

第二種情況是二進制協議,當你正在閱讀一個專門制定了數據(從網絡或文件),那麼你需要使用對齊強制佈局。

0

比對的重要性大多描寫性能和便攜性。如果您不理解您使用的平臺的對齊要求,那麼您的代碼可能不一定能夠在那裏運行,或者只要有人將未正確對齊的代碼(或數據)移動到該平臺上,該代碼就會中斷。

根據的東西,如硬件和OS一些這方面爲您處理,但你要承擔一些罰款制動對齊規則。默認情況下,如果發生對齊錯誤,舊的Windows版本會用於崩潰進程,但今天Windows將能夠恢復,但需要花費額外的CPU週期。

對齊屬性是GCC的特殊功能來強制對齊(它無關,與C語言),排列在你的數據在內存中進行佈局什麼多一些數字。編譯器會在您的數據結構中插入垃圾,以確保您已經對編譯器施加的約束條件得到滿足。

讓我們在你的問題的例子:

struct data 
{ 
    int a __attribute__((aligned (8))) ; 
    char ch __attribute__((aligned (1))) ; 
    float s __attribute__((aligned (4))) ; 
} ; 

我們假設在這種情況下,我們的假想平臺都intfloat本地大小爲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位相同。

編譯器可以選擇更加積極,實際上浪費了更多的空間,但有包指令,以打擊這一點。如果本地二進制兼容性對你來說真的很重要,那麼這些東西就很重要