1.普通數據成員對齊規則:第一個數據成員放在offset為0的地方,以後每個數據成員存儲的起始位置要從該成員大小的整數倍開始(比如int在32位機為4字節,則要從4的整數倍地址開始存儲)。
2.結構體成員對齊規則:如果一個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始存儲。)
3.結構體大小對齊規則:結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊參數的整數倍,不足的要補齊。
struct node{
char b;
int a;
short c;
};
上面結構體sizeof(struct node)=16,這是在32位系統中。為什麼下面給大家講解一下。
char b,只是佔一個字節,但是int b是4個字節。需要對齊,所以char b也佔四個字節,short佔兩個字節,那是不是應該就是10個字節了,答案是錯誤的。滿足原則三所以字節是12. 看下面這個例子。
struct node{
char b;
int a;
short c;
struct node *next;
};
這個很簡單了吧,我電腦是64位系統,struct node *next;是一個地址佔8位,前面是10位,但是要滿足結構體對齊,所以字節數應該是24位。不懂得繼續追問。
如果我們想按一字節對齊或者2位元組對齊等,我們可以採取如下措施。
#pragma pack(push) //保存對齊狀態
#pragma pack(4)//設定為4位元組對齊
#pragma pack(pop)//恢復對齊狀態