| Object-C|对象原理(上) |
|---|
之前讲过了Object-C alloc的底层原理。其最后我们发现最终alloc做了三件事计算内存大小、开辟内存空间、绑定对象与isa
那么我们继续接着往下探讨这三件事儿吧
开辟内存空间
我们已经知道了instanceSize方法作用是计算内存大小,那么它内部是如何计算的呢?我们一起来跟一下


再跟fastInstanceSize进去,发现重要的方法align16代表什么意思呢?
align1616字节对齐,其内部就是一种算法,将二进制最后四位进行抹零处理,达到字节对齐的效果

由此可以得到这里得出16字节大小的内存空间,完成计算

内存对齐
为什么要内存对齐?又为什么要16字节对齐?
因为读取宽度是固定的,而不是根据存储大小而变动。如果不进行内存对齐,很容易造成
读取数据不完整、读取混乱等各种意外情况,而如果要避免这种问题又会对读取速度造成很大的困扰
以前苹果是以8字节对齐。现在已经不满足,升级到16字节对齐
对象是8字节,以8字节的倍数进行对齐,更方便处理、更安全、读取速度更快
tips:
整个字节的影响和对象所容纳的空间、所影响的范围都是由属性影响
系统会对内存进行优化、属性重排
结构体内存对齐
结构体指针大小为8字节,结构体大小由结构体内部属性大小来开辟
1:
数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
⼀个数据成员放在offset为0的地⽅,以后每个数据成员存储的起始位置要
从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存
储。min(当前开始的位置m n) m = 9 n = 49 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|对象原理(下) |
|---|