iOS Tagged Pointer
2021-09-30 本文已影响0人
Shineyok
Tagged Pointer的特点
- Tagged Pointer专门用来存储小的对象 譬如NSNumber和NSDate
- Tagged Pointer指针的值不再是地址,而是真正的值。所以它实际上不是一个指针,而是一个普通变量,所以它的内存并不存储在堆区,也不需要malloc和free
- 在内存读取上有三倍效率,创建时比以前快了106倍
由于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 变量