http://blog.csdn.net/null29/article/details/71191044
10. Tagged Pointer 对象
iPhone 5s 配备了首个采用 64 位架构的 A7 双核处理器,同时提出了 Tagged Pointer 的概念。对于 64 位系统,引入 Tagged Pointer 后,相关逻辑能减少一半的内存占用,3 倍的访问速度提升,100 倍的创建、销毁速度提升。
10.1 原有系统的问题
举个例子:
- NSNumber 对象,在 32 位 CPU 下占 4 个字节,在 64 位 CPU 下占 8 个字节;
- 指针在 32 位 CPU 下占 4 个字节,在 64 位 CPU 下占 8 个字节;
所以如果没有 Tagged Pointer 对象,从 32 位机器迁移到 64 位机器中,虽然逻辑没有变化,但是对象所占用的内存会翻倍:
10.2 Tagged Pointer 介绍
为了改进上面提到的内存占用和效率问题,苹果提出了 Tagged Pointer 对象。将一个对象的指针拆成两部分,一部分直接保存数据,另一部分作为特殊标记,表示这是一个特别的指针,不指向任何一个地址,64 位 CPU 下 NSNumber 的内存图变成下面这样:
10.3 Tagged Pointer 特点
- Tagged Pointer 专门用来存储小的对象,例如 NSNumber 和 NSDate;
- Tagged Pointer 指针的值不再是地址,而是真正的值。所以实际上它不再是一个对象了,只是一个披着对象“皮”的普通变量而已,所以,它的内存并不存储在堆中;
- 在内存读取上有着以前 3 倍的效率,创建时比以前快 106 倍。