一 天然對齊spa
各個類型天然對齊,即其起始內存地址必須是其類型自己的整數倍。內存
對於結構體來講,結構體的起始內存地址,必須是結構體中成員最大長度類型的整數倍。變量
結構體天然對齊應遵照以下規則數據
1 數據成員對齊規則co
在默認狀況下,結構體中各成員變量存放的起始地址相對於結構體的起始地址的偏移量:浮點數
應該是sizeof(成員變量類型)或者sizeof(成員變量類型)的倍數。push
若是結構體中某個成員變量不是基本類型,好比是子結構體,它的起始地址相對於父結構體起始地址的偏移量:結構體
應該是子結構體中最大的基本類型的整數倍。struct
2 總體對齊規則
結構體佔用內存的總大小也有約束條件,爲最大的基本類型內存長度的整數倍。
代碼以下:
typedef struct a
{
char c1;
long i;
char c2;
}A
按照天然對齊的規則1:c1與結構體起始地址偏移爲0,i偏移爲3(必須是i類型long的的倍數),c2偏移爲8
按照天然對齊的規則2:如今偏移0-偏移8的9個字節被佔用,結構體大小必須是最大成員變量類型long的倍數,因此sizeof(a)爲12
typedef struct b
{
char c1;
char c2;
long i;
}B
按照天然對齊的規則1:c1與結構體起始地址偏移爲0,c2偏移爲1,i偏移爲4(必須是i類型long的的倍數),
按照天然對齊的規則2:如今偏移0-偏移7的8個字節被佔用,結構體大小必須是最大成員變量類型long的倍數,因此sizeof(a)爲8
二 強制對齊
#pragma pack(push) //保存當前對齊狀態
#pragma pack(n) //定義對齊單元大小爲n
定義結構體
#pragma pack(pop) //恢復保存的對齊狀態
強制對齊的規則
1 數據成員對齊規則:
n字節對齊是指結構體中成員變量的內存地址與結構體起始地址的偏移量爲:
min(sizeof(基本類型), n)的整數倍
2 總體對齊規則:
結構體的總大小也有約束條件:
min(sizeof(基本類型), n)的整數倍
可見,若是設置#pragma pack(1),就等於禁掉了數據對齊。
棧上對齊方式:
在X86平臺,棧上對齊方式是整數相關類型按照4字節對齊,浮點數按照8字節對齊;在X64平臺,棧上是按照16字節對齊。