字節對齊有三原則:
1:數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以后每個數據成員存儲的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是數組,結構體等)的整數倍開始(比如int在32位機為4字節,則要從4的整數倍地址開始存儲。
2:結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲.(struct a里存有struct b,b里有char,int ,double等元素,那b應該從8的整數倍開始存儲.)
3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊.
例子
struct StructOne {
char a; //1字節 規則1[0]
double b; //8字節 規則2[8-15]
int c; //4字節 規則2[16-19]
short d; //2字節 規則2[20-22] 規則3補齊[23]
} MyStruct1;
struct StructTwo {
double b; //8字節 規則1[0-7]
char a; //1字節 規則1[8]
int c; //4字節 規則1[12-15]
short d; //2字節 規則1[16-17] 規則3補齊[18-23]
} MyStruct2;
struct StructThree {
double b; //8字節 規則1[0-7]
char a; //1字節 規則1[8]
short d; //2字節 規則1[10-11]
int c; //4字節 規則1[12-15]
} MyStruct3;
struct StructFour {
double b; //8字節 規則1[0-7]
char a; //1字節 規則1[8]
short d; //2字節 規則1[10-11]
struct StructThree c;//16字節 規則2[16-31]
} MyStruct4;
NSLog(@"%lu---%lu--%lu--%lu", sizeof(MyStruct1), sizeof(MyStruct2), sizeof(MyStruct3), sizeof(MyStruct4));
打印結果: 24---24--16--32
參考資料
快速弄懂內存字節對齊
iOS 內存字節對齊