原則1:數據成員的對齊規則(以最大的類型字節爲單位)。
結構體(struct)的數據成員,第一個數據成員放在offset爲0的地方,以後每個數據成員存放在offset爲該數據成員大小的整數倍的地方(比如int在32位機爲4字節,則要從4的整數倍地址開始存儲)
原則2:結構體作爲成員的對齊規則。
如果一個結構體B裏嵌套另一個結構體A,則結構體A應從offset爲A內部最大成員的整數倍的地方開始存儲。(struct B裏存有struct A,A裏有char,int,double等成員,那A應該從8的整數倍開始存儲。),結構體A中的成員的對齊規則仍滿足原則1、原則2。
原則3:收尾工作
結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。
總結:結構體中成員的首地址必須是該成員類型所佔內存的整數倍,並且結構體總的字節數必須是最大成員所佔字節數的整數倍。
struct A
{
char c;//0
int i;//4-7
short a;//8-9
//0-9總共10字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取12
//sizeof(A) = 12
};
struct A
{
char c;//0
short a;//2-3
int i;//4-7
//0-7總共8字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取8
//sizeof(A) = 8
};
struct A
{
char c;//0
short a;//2-3
double i;//8-15
char b;//16
//0-16總共17字節,必須是結構體內部最大成員(double)的整數倍,所以這裏取24
//sizeof(A) = 24
};
struct A
{
char c;//0
short a;//2-3
double i;//8-15
//0-15總共16字節,必須是結構體內部最大成員(int)的整數倍,所以這裏取16
//sizeof(A) = 16
};
struct B
{
int a;//0-3
char b[3];//4-6
int c;//8-11
A aa;//A結構體中最大的成員是double,所以從8的整數倍開始存儲,即16
/*A結構體中的元素
char c;//16
short a;//17-18
double i;//24-31
*/
//0-31總共32字節,必須是結構體內部最大成員(double)的整數倍,所以這裏取32
//sizeof(B) = 32
};