Tagged Pointer

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

Tagged Pointer_第1张图片
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数值放在了指针指向的地址中

三、看看源码


Tagged Pointer_第2张图片
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)