美文网首页
Tagged Pointer

Tagged Pointer

作者: 我是C | 来源:发表于2018-09-26 10:25 被阅读65次

    之前研究Autorelease ,看了sunyxx 那篇博客,当你验证代码的时候,会发现和博客不一样,原因就在于Tagged Pointer技术。

    image.png

    一、Tagged Pointer介绍
    1.从64位开始,iOS引入Tagged Pointer技术,用于优化NSNumber、NSString、NSDate等小对象存储。
    2.使用Tagged Pointer后,NSNumber指针中存放着Tag+Data,也就是将数据直接放在指针中。
    3.指针不够存储数据时,才会动态创建一个对象
    4.objc_msgSend能够正确识别Tagged Pointer对象,比如NSNumber的intValue方法,直接从指针中获取,不需要调用方法。

    二、看看代码

            NSNumber *a =  @(1);
            NSNumber *b =  @(12);
            NSNumber *c =  @(313123123);
    
            NSLog(@"a:%p--b:%p--c:%p",a,b,c);
    

    打印如下:

    a:0x127--b:0xc27--c:0x12a9e13327
    

    上面代码不难发现,地址有所不同,并且a,b数值放在了指针指向的地址中

    三、看看源码


    image.png

    objc_msgSend能够正确识别Tagged Pointer对象

    #if OBJC_MSB_TAGGED_POINTERS //iphone
    #   define _OBJC_TAG_MASK (1UL<<63)
    #else
    #   define _OBJC_TAG_MASK 1UL
    #endif
    
    static inline bool 
    _objc_isTaggedPointer(const void * _Nullable ptr) 
    {
        return ((uintptr_t)ptr & _OBJC_TAG_MASK) == _OBJC_TAG_MASK;
    }
    

    判断该对象是Tagged Pointer:
    1.iOS 第 64位 是1
    2.Mac 第0位 是1

    相关文章

      网友评论

          本文标题:Tagged Pointer

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