在之前的文章中,我已經理解爲什麼我們必須對等於最大屬性大小的結構進行對齊。內存調整 - 結構調整和不處理大小的結構倍數的總大小
現在,我想知道爲什麼,一旦我們選擇了這種對齊方式,我們必須進行填充,以使總體結構尺寸是結構對齊的倍數而不是處理器字的尺寸。
下面的例子:
#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 ...
感謝您的幫助
正如你所說,結構需要8字節對齊。它也必須在數組內部。因此,它的大小必須是8的倍數。 – molbdnilo 2014-10-08 20:53:19