iOS 浅尝内存对齐原理

324 阅读2分钟

首先说明为什么内存里面要有对齐这个说法,因为数据成员内存分布,如果参差不齐,如卵石铺路的话,就像这种

系统假设
一个数据紧挨一个数据,这样紧凑,是不是感觉内存用的很压实,还感觉空间相对数据对齐多余补齐还节省一点,其实内存不是考虑的是快,如何读取效率更高,对,这种对齐相对于紧凑读取效率更高

对就是以空间换取读取时间

属性对齐

1 属性内存规则为8位对齐,但并不是每个属性都占用8位,例如NSString->8字节,int 4字节  char 1字节
2 第一个属性是以0的第一个位置为开端,此后每个属性成员的起始位置都要从本身大小的整数倍开始,例如:int 4字节,就要从4的整数倍开始存储,NSString为8字节,就要从8的整数倍开始存储
3 假如属性本身又包含其他成员,就要从成员的内部的元素最大的整数倍开始存储
4 数据总大小就是sizeof 的结果,必须是内部最大成员的整数倍
例如:

LGTeacher 该类,有name age两个成员
改数据对齐情况 

name->8位 ,int->四位,int一列需要补齐8位,最后8位对齐

如果说属性成员比较多呢 举例:LGTeacher有成员: NString *name; Int age; char sym; long heiht; 那么他的对齐方式如图所示

对象对齐规则

对象对齐方式为16位对齐,对象的大小都是以16的整数倍对齐,不够整数倍当然也是补齐 假如我的对象结构是这样的

没有任何成员,那么他不够16,内存申请最小也是16,系统也为为他开辟16

那么如果LGTeacher有成员: NString *name; Int age; char sym; long heiht; 那么LGTeacher的对齐方式如图所示

以上就是简单一些内存对齐规则,有何不足之处,路过大神请多指教