2.对象原理探究

po 0x0000000000000000 为空是因为sex 属性没有赋值,所以是nil

因为char 是1个字节,int 是 4个字节,所以在 0x0000001200006261 值 中,0x12代表的是age, 0x62 代表的是字符'b'的ascII 码, 0x61 代表的是字符'a'的ascII 码

对象和结构体在堆中

字节对齐实例:

二进制重排可以作为内存优化的方式。


例:

LGPerson 中没有其他属性,所以class_getInstanceSize 返回的是属性对齐,这时只有一个isa ,所以是8

对象申请的内存大小 和 系统开辟的大小是不一致的

class_getInstanceSize 直接返回的是属性的对齐

对ro 属性的字节对齐,ro 中主要是属性、方法等

探究,在这里可以看到size 为40 ,然后进入了calloc 方法中,calloc 在 malloc 的源码中

注: 如果跑malloc 源码有问题,出现 _radix_tree_create 报错,可以搜索 radix_tree_create,直接干掉


#define SHIFT_NANO_QUANTUM 4
#define NANO_REGIME_QUANTA_SIZE (1<< SHIFT_NANO_QUANTUM)    //  1 左移4位为 16

40 + 16 - 1 >> 4 <<4  其实就是16字节对齐,那么40 的16字节对齐就是48

前面8字节对齐,相对于对象里的属性

后面是16字节对齐,相对于对象来说


编译器优化

类的+(void)load 方法是非常耗时的,因为它会使得本类变为非懒加载类,需要编译和加载。


 initIsa

union isa_t  联合体

八个字节,每个字节有八位

isa 的结构

isa 八字节,64位

ISA_BITFIELD 对不同的cpu 架构或有不同的结果

你可能感兴趣的:(2.对象原理探究)