内联布尔 objc_object::isTaggedPointer();该功能如何工作?

inline bool objc_object::isTaggedPointer(); How does the function work?

当我阅读runtime,

我不明白该功能是如何工作的。

inline bool 
objc_object::isTaggedPointer() 
{
    return ((uintptr_t)this & TAG_MASK);
}

下面是TAG_MASK的定义:

#if SUPPORT_MSB_TAGGED_POINTERS
#   define TAG_MASK (1ULL<<63)
#   define TAG_SLOT_SHIFT 60
#   define TAG_PAYLOAD_LSHIFT 4
#   define TAG_PAYLOAD_RSHIFT 4
#else
#   define TAG_MASK 1
#   define TAG_SLOT_SHIFT 0
#   define TAG_PAYLOAD_LSHIFT 0
#   define TAG_PAYLOAD_RSHIFT 4
#endif

我知道如果 TAG_MASK 等于 1,函数 return false.But 当函数 return 为真时为什么这个函数可以判断结果。 谢谢!

标记指针是一种无需分配即可创建对象的方法。

因此,运行时需要能够检测对象是否是对已分配内存块的引用,或者对象指针是否真的是数据。

它通过将 "pointer" 中的一位设置为 1 来实现这一点。对于常规分配,该位通常始终为 0。有两种模式; "most significant bit" 和 "least significant bit"。

在LSB模型中,使用第一位。分配内存时,所有分配都是对齐的,因此低位永远不应该为零。通过将其设置为零,运行时可以键入它来检测标记的指针。 MSB 模型将位移动到最高位(这是安全的,因为没有人 应该 将内存映射到设置了最高位的区域。

isTaggedPointer() returns YES/true 如果最低位设置在 LSB 模型中 YES/true 如果最高位设置在 MSB 模型中。