原則1 數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct或聯(lián)合union)的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員大小的整數(shù)倍開始(比如int在32位機為4字節(jié),則要從4的整數(shù)倍地址開始存儲)。
原則2 結(jié)構(gòu)體作為成員:如果一個結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲。(struct a里存有struct b,b里有char,int,double等元素,那b應該從8的整數(shù)倍開始存儲。)
原則3 收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,必須是其內(nèi)部最大成員的整數(shù)倍,不足的要補齊。
struct A
{
short a; //大小為2, 因為b的大小是4,所以要補2
int b; //大小為4
char c; // 大小為1
// 所以2+2+4+1+3 = 12 ,最后的三,因為“原則3”,9并不是4的倍數(shù),所以需要補3
};
struct B
{
int a; // 大小為4,
char b; // 大小為1,因為c大小為2,所以b需要補1
short c; //大小為2
// 所以4+1+1+2 = 8(也滿足原則3)
};
struct C
{
int a; // 大小為4,開始為0,不用補位
double b; // 大小為8,開始不是8的倍數(shù),所以int后要補4位
float c; // 大小為8, 地址正好是8的倍數(shù),所以不用補位
// 所以 4+4+8+8 = 24;
};
struct D
{
char e[2]; //大小為2,因為f為4,所以補2 = 4
int f; // 大小為4,因為e補了2所以g的起始地址正好是8的倍數(shù),所以不用補位
double g; // 大小為8
float h; // 大小為8
struct C i; // 因為前面總數(shù)為8的倍數(shù)(C的最大值為8)所以不用補位(總大小為24)
// 所以 2+2+4+8+8+24 = 48,滿足第三條
};