2014-10-08 39 views
1

在之前的文章中,我已經理解爲什麼我們必須對等於最大屬性大小的結構進行對齊。內存調整 - 結構調整和不處理大小的結構倍數的總大小

現在,我想知道爲什麼,一旦我們選擇了這種對齊方式,我們必須進行填充,以使總體結構尺寸是結構對齊的倍數而不是處理器字的尺寸。

下面的例子:

#include <stdio.h> 

// Alignment requirements 
// (typical 32 bit machine) 

// char   1 byte 
// short int 2 bytes 
// int   4 bytes 
// double  8 bytes 

typedef struct structc_tag 
{ 
    char  c; 
    double  d; 
    int   s; 
} structc_t; 

int main() 
{ 
    printf("sizeof(structd_t) = %d\n", sizeof(structd_t)); 

    return 0; 
} 

我們可以認爲structd_t的是大小等於20個字節:

char  c; 
    char Padding1[7] 
    double  d; 
    int   s; 

,因爲我們已經採取了結構alignement等於8(雙d) 。

但實際上,總大小等於24,因爲20不是8的倍數,我們必須在「int s」之後進行填充(char Padding2 [4])。

如果我採用一個結構數組,每個結構的第一個元素在32位處理器(0,20,40)的良好地址上,因爲20,40是4的倍數(處理字大小) 。

所以爲什麼我需要填充8的倍數(結構對齊),即在這個例子中是24字節,而不是20字節(這給了32位處理器的良好地址(字大小= 4個字節):0,20,40 ...

感謝您的幫助

+1

正如你所說,結構需要8字節對齊。它也必須在數組內部。因此,它的大小必須是8的倍數。 – molbdnilo 2014-10-08 20:53:19

回答

3

考慮struct_t array[n]會結構的大小爲20(而不是多個8),第二個元素是在4對齊。字節邊界

澄清:假設array[0]位於地址0如果第e結構是20array[1]從地址20開始,並且它的d登陸地址28,這不是雙精度對齊。

+0

我不明白「第二個元素在4字節邊界處對齊」是什麼意思,你能更精確地解釋一下嗎? – youpilat13 2014-10-08 20:44:46

+0

加入請求。這個我不清楚。 – user2962533 2016-06-16 14:17:26

+0

@ user2962533請參閱編輯 – user58697 2016-06-16 17:34:35