iOS底层 -- Runtime之isa底层结构

2020-09-11  本文已影响0人  happy神悦

在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始, 对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息

union isa_t 
{
    Class cls;
    uintptr_t bits;
    
#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
    struct {
        uintptr_t nonpointer        : 1;
        uintptr_t has_assoc         : 1;
        uintptr_t has_cxx_dtor      : 1;
        uintptr_t shiftcls          : 33; 
        uintptr_t magic             : 6;
        uintptr_t weakly_referenced : 1;
        uintptr_t deallocating      : 1;
        uintptr_t has_sidetable_rc  : 1;
        uintptr_t extra_rc          : 19;
    };
};

共同体的所有信息都存储在bits中,ISA_MASK,ISA_MAGIC_MASK,ISA_MAGIC_VALUE都是掩码,用bits和这些掩码相与就可以得到nonpointer,has_assoc,shiftcls等信息。nonpointer,has_assoc,shiftcls也都采用了位域,它们占用的位数都在后面标出了。

上一篇 下一篇

猜你喜欢

热点阅读