isa_t

代替 isa 指针的是结构体 isa_t

当实例方法被调用时,它要通过自己持有的isa 来查找对应的类,然后在object_class的 class_data_bits_t中查找对应方法的实现

objc-private.h  能翻出其定义


对于不支持优化的,isa_t共用体,我们用到的只有cls,也就是类指针,对于支持优化的,例如__x86_64__ ,iPhone5s等架构为 __arm64__,我们使用的是结构体,具体结构体的实现和位数可能有些差别,不过这些字段都是存在的。


我们可以通过 isa 初始化的方法 initIsa 来初步了解这 64 位的 bits 的作用:

inline void objc_object::initInstanceIsa(Class cls, bool hasCxxDtor)

{

initIsa(cls, true, hasCxxDtor);

}

inline void objc_object::initIsa(Class cls, bool indexed, bool hasCxxDtor)

{

    if (!indexed) {

         isa.cls = cls; 

    } else {

          isa.bits = ISA_MAGIC_VALUE;

          isa.has_cxx_dtor = hasCxxDtor;

          isa.shiftcls = (uintptr_t)cls >> 3;

     }

}

由于在 initInstanceIsa 方法中传入了 indexed = true,所以,我们简化一下这个函数的实现:

inline void objc_object::initIsa(Class cls, bool indexed, bool hasCxxDtor)

{

      isa.bits = ISA_MAGIC_VALUE;

      isa.has_cxx_dtor = hasCxxDtor;

      isa.shiftcls = (uintptr_t)cls >> 3;

}

#define ISA_MAGIC_VALUE 0x001d800000000001ULL

由于共用体的特性,对bits赋值,等价于对结构体赋值。0x0000000000000001ULL 64位二进制数,放入共用体变量空间。

我感觉这个uintptr_t,于大小端模式是有关系的,这也是疑惑。假设是,小端模式。

又因为,结构体首成员在低地址,尾成员在高地址。

在使用 ISA_MAGIC_VALUE 设置 isa_t 结构体之后,实际上只是设置了 indexed 以及 magic 这两部分的值。结构体其余成员均为0。(indexed= 1)

其中 indexed 表示 isa_t 的类型:

0 表示 raw isa,也就是没有结构体的部分,访问对象的 isa 会直接返回一个指向 cls 的指针,也就是在 iPhone 迁移到 64 位系统之前时 isa 的类型

1 表示当前 isa 不是指针,但是其中也有 cls 的信息,只是其中关于类的指针都是保存在 shiftcls 中。

magic 用于调试器判断当前对象是真的对象还是没有初始化的空间

isa.has_cxx_dtor = hasCxxDtor;

在设置 indexed 和 magic 值之后,会设置 isa 的 has_cxx_dtor,这一位表示当前对象有 C++ 或者 ObjC 的析构器(destructor),如果没有析构器就会快速释放内存。

isa.shiftcls = (uintptr_t)cls >> 3;

在为 indexed、 magic 和 has_cxx_dtor 设置之后,我们就要将当前对象对应的类指针存入 isa 结构体中了。

使用整个指针大小的内存来存储 类地址(cls)有些浪费,尤其在 64 位的 CPU 上。在 ARM 64 运行的 iOS 只使用了 33 位作为指针(与结构体中的 33 位无关,Mac OS 上为 47 位),而剩下的 31 位用于其它目的。类的指针也同样根据字节对齐了,每一个类指针的地址都能够被 8 整除,也就是使最后 3 bits 为 0,为 isa 留下 34 位用于性能的优化。苹果的ARM64运行时利用了一些很棒的性能改进

这一段话是什么意思呢?

64位CPU地址总线通常64根,表示的二进制数64位,也就是一个地址8个字节。无论是类地址,对象地址。但是呢,这64个字节并不是全部用到,没用到的高位补0,我们看以十六进制打印的类地址,有12*4=48,有9*4=36,我们肯定取48,但是48位的,最高位十六进制均为7,转为二进制位0111,也就是说,64位的有效位只有48-1=47位,其余高位补0。而ARM64上,类的地址有效位只有33位。

而且,地址是要内存对齐的,如64位八字节对齐(地址都能够被8整除),因此,这些有效位中,最低三位必然为0

因此,在isa中存储Class指针时右移三位是没有问题的。


我搜索到了一篇文章,是arm64 and you的译文  中有这么一段话:

尽管指针为64位,但在实际使用中,这些位数并不是都用上了。例如X86-64的Mac OS X系统仅使用了其中的47位。而ARM64上占用得更少,目前只有33位。只要未被系统全部占用,这些指针就能用于存储数据。这是Objective-C Runtime演进史上最重要的变化之一。

Objective-C对象是连续的内存块,这个内存块中第一个指针大小的部分称为ISA。一般来说,ISA是一个指向该对象所属类的指针。不过这么大的空间仅作为指针有点儿浪费,尤其是在64位CPU上。运行iOS的ARM64目前仅使用了一个指针的33位,而其余31位则另作他用。另外,类 指针还需要对齐,这就释放了另外3位,于是ISA指针中共有34位可另作他用。苹果的ARM64 Runtime正是利用了这一点使性能有了大幅提升。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,673评论 0 9
  • (转载)Blog:http://draveness.me/ 关注仓库,及时获得更新:iOS-Source-Code...
    hope7th阅读 598评论 0 5
  • 原文链接: http://draveness.me/isa/关注仓库,及时获得更新:iOS-Source-Code...
    Draveness阅读 2,521评论 5 26
  • 转自http://www.jianshu.com/p/af485c916df1 1.概要 对于Runti...
    风寻月觅阅读 590评论 0 0
  • 迈着青春的脚步,不知不觉就走进了七月,七月是那个女孩最喜欢的一个月份,因为七月她总是碰到很多事,很多人。 记得七月...
    小依LHX阅读 533评论 0 2