字節(jié)對齊有三原則:
1:數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員大小或者成員的子成員大?。ㄖ灰摮蓡T有子成員,比如說是數(shù)組,結(jié)構(gòu)體等)的整數(shù)倍開始(比如int在32位機(jī)為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應(yīng)該從8的整數(shù)倍開始存儲.)
3:收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,.必須是其內(nèi)部最大成員的整數(shù)倍.不足的要補(bǔ)齊.
例子
struct StructOne {
char a; //1字節(jié) 規(guī)則1[0]
double b; //8字節(jié) 規(guī)則2[8-15]
int c; //4字節(jié) 規(guī)則2[16-19]
short d; //2字節(jié) 規(guī)則2[20-22] 規(guī)則3補(bǔ)齊[23]
} MyStruct1;
struct StructTwo {
double b; //8字節(jié) 規(guī)則1[0-7]
char a; //1字節(jié) 規(guī)則1[8]
int c; //4字節(jié) 規(guī)則1[12-15]
short d; //2字節(jié) 規(guī)則1[16-17] 規(guī)則3補(bǔ)齊[18-23]
} MyStruct2;
struct StructThree {
double b; //8字節(jié) 規(guī)則1[0-7]
char a; //1字節(jié) 規(guī)則1[8]
short d; //2字節(jié) 規(guī)則1[10-11]
int c; //4字節(jié) 規(guī)則1[12-15]
} MyStruct3;
struct StructFour {
double b; //8字節(jié) 規(guī)則1[0-7]
char a; //1字節(jié) 規(guī)則1[8]
short d; //2字節(jié) 規(guī)則1[10-11]
struct StructThree c;//16字節(jié) 規(guī)則2[16-31]
} MyStruct4;
NSLog(@"%lu---%lu--%lu--%lu", sizeof(MyStruct1), sizeof(MyStruct2), sizeof(MyStruct3), sizeof(MyStruct4));
打印結(jié)果: 24---24--16--32