iOS底层探索 之 结构体内存对齐

131 阅读2分钟

首先上图看下各个数据类型占用内存的大小

image.png

对齐原则如下:

1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第

一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要

从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,

结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存

储。 min(当前开始的位置mn)m=9n=4

9 10 11 12

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从

其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b

里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大 课程研发:Cooci老师

成员的整数倍.不足的要补⻬。

现在我们先定义两个结构体,注意看里面的数据类型,同样是a、b、c、d四个基本数据类型

image.png 先抛出一个疑问,上图中的两个结构体所占用的内存是否一致呢?

我们根据对齐原则进行计算

HLStruct1

double a;      // 8    [0 7]   对齐的时候从0号位置开始

char b;        // 1    [8]

int c;          // 4    (9 10 11 [12 13 14 15]

short d;        // 2    [16 17] 24

再看HLStruct2

double a; // 8 [0 7]

int b;          // 4    [8 9 10 11]

char c;        // 1    [12]

short d;        // 2    (13 [14 15] 16

结果发现因为定义的先后顺序不同真的影响到了最终结构体的内存大小(分别为

24,16),难道我们写代码的时候还要按照特定的顺序来吗?

当然不用这样麻烦

在CPU读内存的时候,统一分配固定长度,当碰到不满足长度时,苹果有内存优化,会先进行组合,用时间换空间,加快内存优化。