结构体内存对齐

368 阅读2分钟

内存图

image.png

内存对齐原则

1.数据成员对⻬规则:

结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储。

2.结构体作为成员:

如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3.收尾工作:

结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。

实例

struct LGStruct1 {
    double a;      //8byte 根据第一条原则 应在[0,7]
    char b;        //1     8为1的整数倍 [8]
    int c;         //4     9,10,11不是4的整数倍 [12,13,14,15]
    short d;       //2     16 是2的整数倍 [16,17]
}struct1;          //      根据收尾原则,取8的整数倍  得出24

struct LGStruct2 {
    double a;      //8byte 根据第一条原则 应在[0,7]
    int b;         //2     8为2的整数倍 [8,9,10,11]
    char c;        //1     12为1的整数倍 [12]
    short d;       //2     13不是2的整数倍  [14,15]
}struct2;          //      根据收尾原则,取8的整数倍  得出16

struct LGStruct3 {
    double a;              //8byte 根据第一条原则   [0,7]
    int b;                 //4     8为4的整数倍    [8,9,10,11]
    char c;                //1     12为1的整数倍   [12]
    short d;               //2     13不是2的整数倍 [14,15]
    int e;                 //4     16是4的整数倍 [16,17,18,19]
    struct LGStruct1 str;  // 根据第二条原则 LGStruct1 最大元素为8,所以从8的整数位开始
                           //   20,21,22,23 不是8的整数位,从24开始
                           //   为 [24-31],[32][36 37 38 39][40 41] str收尾取整 到 47
}struct3;                  //   收尾原则,取8的整数,得到48

NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));
NSLog(@"sizeof(struct3) = %lu",sizeof(struct3));

输出结果 
24-16
sizeof(struct3) = 48