iOS Tagged Pointer

2021-09-30  本文已影响0人  Shineyok

Tagged Pointer的特点

由于Tagged Pointer并非一个真正的对象,所以它是没有isa指针的,不能直接访问Tagged Pointer的isa成员,但可以用isKindOfClass和object_getClass这种

Tagged Pointer的由来

众所周知,一个NSObject对象占用8个字节。但很显然,NSNumber、NSDate一类的变量本身值需要占用的内存大小往往不需要8个字节,拿整数来说,4个字节所能够表达的符号整数可以达到2^31=2147483648,即二十多亿(另外一位作为符号位),如果没有Tagged Pointer对象的话,为了存储和访问一个NSNumber对象,我们需要在堆上为其分配内存,栈上储存其指针,另外还要维护其引用计数、生命周期,这样就造成了运行效率上的浪费。为了改进内存占用和效率问题,苹果提出了Tagged Pointer对象,把指针分为两部分,一部分直接保存数据,另一部分作为特殊标记(0xb开头),表示其不指向任何地址。

当 8 字节可以承载用于表示的数值时,系统就会以Tagged Pointer的方式生成指针,如果 8 字节承载不了时,则又用以前的方式来生成普通的指针

总结

苹果将Tagged Pointer引入,给 64 位系统带来了内存的节省和运行效率的提高。Tagged Pointer通过在其最后一个 bit 位设置一个特殊标记,用于将数据直接保存在指针本身中。因为Tagged Pointer并不是真正的对象,我们在使用时需要注意不要直接访问其 isa 变量

上一篇下一篇

猜你喜欢

热点阅读