1.??對齊原則:
- 數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以后每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
- 結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
- 結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。
備注:數組成員按長度按數組類型長度計算,如char t[9],在第1步中數據自身長度按1算,累加結構體時長度為9;第2步中,找最大數據長度時,如果結構體T有復雜類型成員A,該A成員的長度為該復雜類型成員A的最大成員長度。
小結:當#pragma pack的n值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
?【注意】(對齊位數跟處理器位數和編譯器都有關)VS, VC等編譯器默認是#pragma pack(8),所以測試我們的規則會正常;注意gcc默認是#pragma pack(4),并且gcc只支持1,2,4對齊。套用三原則里計算的對齊值是不能大于#pragma pack指定的n值。
2. 自然對齊:存放變量的地址要是該變量數據類型大小的整數倍。如:存放int型數據的地址一定要是4的倍數,存放short型數據的地址一定要是2的倍數。
?
3. 改變缺省的對界條件(指定對界):
- 使用偽指令#pragma pack (n),C編譯器將按照n個字節對齊。
- 使用偽指令#pragma pack(),取消自定義字節對齊方式。