美文网首页
iOS Tagged Pointer

iOS Tagged Pointer

作者: Shineyok | 来源:发表于2021-09-30 13:49 被阅读0次

    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 变量

    相关文章

      网友评论

          本文标题:iOS Tagged Pointer

          本文链接:https://www.haomeiwen.com/subject/hsjenltx.html