内存对齐原则

808 阅读2分钟

通篇会以一下三个个结构体为例讲解

typedef struct Student
{
    char sex;
    int num;
    double score;
    short age;
}Student;

typedef struct Student1
{
    double score;
    int num;
    short age;
    char sex;
}Student1;

typedef struct Team
{
    int            teamNum;
    struct Student student1;
}Team;

  • 内存对齐原则**(注意:OC对象的对齐原则是16字节对齐)**

    • 每个结构体的成员,第一个成员都位于偏移为0的位置,以后每个数据成员的偏移量min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数** 一般情况下不指定#pragma pack()默认长度32位系统是4字节,64位系统是8字节**
    • 在数据完成各自对齐之后,结构体本身也要对齐,结构体的大小要和该结构体内最大元素大小的倍数,不够补齐
      图解内存对齐
    1. 结构体Student的内存占用情况:
    2. 结构体Student1的内存占用情况: 从以上两个结构体可以发,成员都是一样的但是两个结构体所占用的空间却不同,所以在定义结构体的时候注意成员的定义顺序可以有效的节省空间
    3. 结构体Team的内存占用情况:
      Team这个结构体有点不同,是结构体内套用结构体,这种情况要遵循两个原则,首先第一点就是要将嵌套结构体内要内存对齐,然后就是嵌套结构体的起始位的偏移量必须是嵌套结构体内的占用最大内存属性的倍数就好,其他都一样
      最后得出Team的结构体所占用的内存是24字节
  • 分析内存对齐后的优点

    1. 分析内存对齐的优缺点之前先看一下cpu存取方式,大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度,64位系统的内存存取粒度的大小是8字节32位系统内存存取粒度的大小是4字节
    2. 对齐之前cpu如何读取数据(32位系统为例)
    3. 对齐之后cpu如何读取数据(32位系统为例)
    4. 不难看出没对齐之前cpu去一个数据又要剔除某一段数据又要合并数据的,需要做很多工作,而合并之后一次就读取到了想要的数据,所以内存对齐可以很大程度上提成CPU访问速度(用空间换时间)