我想知道爲什麼我們必須爲結構的對齊大小,將對齊大小等於結構中的最大構件大小。內存對齊到結構中 - 對齊大小等於最大成員大小
例子:
struct MixedData
{
char Data1;
short Data2;
int Data3;
char Data4;
};
如果我們把最大的成員(int Data3)
,對齊爲4個字節,所以我們要做的:
struct MixedData /* After compilation in 32-bit x86 machine */
{
char Data1; /* 1 byte */
char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary
assuming that the address where structure begins is an even number */
short Data2; /* 2 bytes */
int Data3; /* 4 bytes - largest structure member */
char Data4; /* 1 byte */
char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};
但是我爲什麼不有,char Data1
後, char Padding1[3]
so short Data2
開始於adress(Data1) + 4
而不是char Data1[1]
?
而且,在邏輯相同的情況下,爲什麼short Data2
之後沒有short Padding3[1]
?
另一個問題是:如果我在64位處理器,應該使用一個8個字節alignement,所以我已設置以下:
struct MixedData /* After compilation in 64-bit x86_64 machine */
{
char Data1; /* 1 byte */
char Padding1[7]; /* 7 bytes */
int Data3;
int Padding2[1]/* 4 bytes */
char Data4;
char Padding3[7]; /* 7 bytes to make total size of the structure 24 bytes */
};
?
所以總大小24字節是8字節的倍數?
填充通常做的「自然」對齊一個字段。也就是說,dword字段是雙字對齊的,字字段是字對齊的,依此類推。對於訪問不是雙字對齊的字大小字段(但是字對齊)沒有懲罰。 – 2014-10-07 22:57:48
@ 500-InternalServerError:應該已發佈爲答案而不是評論。 – 2014-10-07 23:37:51