po 0x0000000000000000 為空是因?yàn)閟ex 屬性沒有賦值葛菇,所以是nil
因?yàn)閏har 是1個(gè)字節(jié)惕医,int 是 4個(gè)字節(jié),所以在?0x0000001200006261 值 中,0x12代表的是age, 0x62 代表的是字符'b'的ascII 碼口四,?0x61 代表的是字符'a'的ascII 碼
對象和結(jié)構(gòu)體在堆中
字節(jié)對齊實(shí)例:
二進(jìn)制重排可以作為內(nèi)存優(yōu)化的方式。
例:
LGPerson 中沒有其他屬性秦陋,所以class_getInstanceSize 返回的是屬性對齊蔓彩,這時(shí)只有一個(gè)isa ,所以是8
對象申請的內(nèi)存大小 和 系統(tǒng)開辟的大小是不一致的
class_getInstanceSize 直接返回的是屬性的對齊
對ro 屬性的字節(jié)對齊驳概,ro 中主要是屬性赤嚼、方法等
探究,在這里可以看到size 為40 顺又,然后進(jìn)入了calloc 方法中更卒,calloc 在 malloc 的源碼中
注: 如果跑malloc 源碼有問題,出現(xiàn) _radix_tree_create 報(bào)錯(cuò)待榔,可以搜索 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? 其實(shí)就是16字節(jié)對齊,那么40 的16字節(jié)對齊就是48
前面8字節(jié)對齊锐锣,相對于對象里的屬性
后面是16字節(jié)對齊腌闯,相對于對象來說
編譯器優(yōu)化
類的+(void)load 方法是非常耗時(shí)的,因?yàn)樗鼤沟帽绢愖優(yōu)榉菓屑虞d類雕憔,需要編譯和加載姿骏。
?initIsa
union isa_t? 聯(lián)合體
八個(gè)字節(jié),每個(gè)字節(jié)有八位
isa 的結(jié)構(gòu)
isa 八字節(jié)斤彼,64位