struct One{
double d;
char c;
int i;
}
struct Two{
char c;
double d;
int i;
}
許多實際的計算機系統對基本類型數據在內存中存放的位置有限制,它們會要求這些數據的首地址的值是某個數k(通常它爲4或8)的倍數,這就是所謂的內存對齊。
每個特定平臺上的編譯器都有自己的默認“對齊係數”(32位機一般爲4,64位機一般爲8)。我們可以通過預編譯命令#pragma pack(k),k=1,2,4,8,16來改變這個係數,其中k就是需要指定的“對齊係數”;也可以使用#pragma pack()取消自定義字節對齊方式。
struct 或者 union 成員對齊規則如下:
1. 第一個數據成員放在offset爲0的地方,對齊按照對齊係數和自身佔用字節數中,二者比較小的那個進行對齊;
2. 在數據成員完成各自對齊以後,struct或者union本身也要進行對齊,對齊將按照對齊係數和struct或者union中最大數據成員長度中比較小的那個進行;
先局部成員對齊,然後再全局對齊。