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位