iOS 内存对齐

为什么要内存对齐?

1、平台原因(移植原因)不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

内存对齐规则

1、对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的存储起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。
2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3、收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。

代码验证

接下来我们通过一段代码来验证这个规则。

struct Struct1 {
    char a;     // 1 从初始位置开始排 占第0位
    double b;   // 8 从8的倍数开始排 占8~15
    int c;      // 4 从4的倍数开始排 占16~19
    short d;    // 2 从2的倍数开始排 占20~21
    // 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。所以最后总的内存大小应该为8的倍数  24位
} JKStruct1;

struct Struct2 {
    double b;   // 8 从初始位置开始排 占0~7位
    char a;     // 1 从1的倍数开始排 占第8位
    int c;      // 4 从4的倍数开始排 占12~15位
    short d;    // 2 从2的倍数开始排 占16~17位
        // 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。所以最后总的内存大小应该为8的倍数  24位
} JKStruct2;


struct Struct3 {
    double b;   // 8 从初始位置开始排 占0~7位
    int c;      // 4 从4的倍数开始排 占8~11位
    char a;     // 1 从1的倍数开始排 占第12位
    short d;    // 2 从2的倍数开始排 占14~15位
        // 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。所以最后总的内存大小应该为8的倍数  16位
} JKStruct3;

上面三个结构体没有嵌套的类型,所以直接采用内存对齐的第一条规则,输出的结果为

 JKStruct1-24
 JKStruct2-24
 JKStruct3-16

我们再来验证嵌套的情况

struct Struct3 {
    double b;   // 8 从初始位置开始排 占0~7位
    int c;      // 4 从4的倍数开始排 占8~11位
    char a;     // 1 从1的倍数开始排 占第12位
    short d;    // 2 从2的倍数开始排 占14~15位
        // 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。所以最后总的内存大小应该为8的倍数  16位
} JKStruct3;


struct Struct4 {
    double b;   // 8 从初始位置开始排 占0~7位
    int c;      // 4 从4的倍数开始排 占8~11位
    struct Struct3 a;     // a为Struct3类型,其内部内存对齐依然按照内存对齐规则的第一条进行对齐,对齐后为16字节,从16的倍数开始排 占 16~31
    short d;    // 从2的倍数开始排 占32~33位
        // 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补⻬。因为a为结构体类型,所以最大内存的成员应取double ,所以最后总的内存大小应该为8的倍数  40位
} JKStruct4;

嵌套的情况采用内存对齐的第二条规则,输出结果如下

JKStruct4-40

非常感谢你阅读我的文章,如有不对之处还望指点。

你可能感兴趣的:(iOS 内存对齐)