Object-C|对象原理(上) |
---|
之前讲过了Object-C alloc
的底层原理。其最后我们发现最终alloc
做了三件事计算内存大小
、开辟内存空间
、绑定对象与isa
那么我们继续接着往下探讨这三件事儿吧
开辟内存空间
我们已经知道了instanceSize
方法作用是计算内存大小,那么它内部是如何计算的呢?我们一起来跟一下
再跟fastInstanceSize
进去,发现重要的方法align16
代表什么意思呢?
align16
16字节对齐,其内部就是一种算法,将二进制最后四位进行抹零处理,达到字节对齐的效果
由此可以得到这里得出16字节
大小的内存空间,完成计算
内存对齐
为什么要内存对齐?又为什么要16字节
对齐?
因为读取宽度是固定的,而不是根据存储大小而变动。如果不进行内存对齐,很容易造成
读取数据不完整
、读取混乱
等各种意外情况,而如果要避免这种问题又会对读取速度造成很大的困扰
以前苹果是以8字节
对齐。现在已经不满足,升级到16字节
对齐
对象
是8字节
,以8字节
的倍数进行对齐,更方便处理、更安全、读取速度更快
tips:
整个字节的影响和对象所容纳的空间、所影响的范围都是由属性影响
系统会对内存进行优化、属性重排
结构体内存对齐
结构体指针大小为8字节
,结构体大小由结构体内部属性大小来开辟
1:
数据成员对⻬规则
:结构(struct)(或联合(union))的数据成员,第
⼀个数据成员放在offset
为0的地⽅,以后每个数据成员存储的起始位置要
从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
结构体等)的整数倍开始(⽐如int
为4字节,则要从4的整数倍地址开始存
储。min(当前开始的位置m n) m = 9 n = 4
9 10 11 12
2:结构体作为成员
:如果⼀个结构⾥有某些结构体成员,则结构体成员要从
其内部最⼤元素⼤⼩的整数倍地址开始存储.(struct a⾥存有struct b,b
⾥有char
,int
,double
等元素,那b应该从8的整数倍开始存储.)
3:收尾⼯作
:结构体的总⼤⼩,也就是sizeof
的结果,.必须是其内部最⼤成员的整数倍.不⾜的要补⻬
获取内存大小的方式
Sizeof
获取数据类型大小
class_getInstanceSize
计算对象实际占用的内存大小、是采用8字节
对齐
malloc_size
对象实际分配内存大小、采用16进制
对齐
16字节的内存对齐算法
alloc
源码分析中的align16
malloc
源码分析中segregated_size_to_fit
Object-C|对象原理(下) |
---|