iOS开发 内存对齐原理

1.文字描述

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

2.案例实践

实践之前,我们先从一张图了解各数据类型所占字节数:


图片.png

案例:

struct LGStruct1 {
    double a;    //  8 [0-7] 
    char b;      //  1  [8 1] (8)
    int c;       //  4  [9 4] 9 10 11 (12 13 14 15)
    short d;     //  2  [16 2] (16 17)
}struct1;

分析:
a占8个字节,b占一个字节,c占4个字节,d占2个字节;
根据内存对齐原理,struct1要从字节最大的8开始存起,即a占0~7;
当存储b的时候,存储起始位置8是1的整数倍,所以存储一个字节,即b占8;
当存储c的时候,存储起始位置9不是4的整数倍,则向后寻找最近的4的整数倍,即c占12~15;
当存储d的时候,存储起始位置16是2的整数倍,则存储两个字节,即c占16~17;
这样struct1总共的存储大小便是0~17,即内存大小为18;
再根据上面对齐原理最后一条,结构体的总大小是其内部最大成员的整数倍,而struct1内部最大成员是a,即8的整数倍,即为18后面的24,所以struct1总大小为24。

3.内存对齐原理的意义

利用空间换时间,提高读取效率

你可能感兴趣的:(iOS开发 内存对齐原理)