前言
从一句代码说起:NSNumber *num = @(20);
只需要存储20这个数据。
按正常的技术方案,在64位CPU下,应该先去创建NSNumber
对象,其值是20,然后再有个指向该地址的指针num。 虽然没有什么问题,但是造成了浪费。
-
内存浪费
由于OC中的内存对齐,在64位下,创建一个对象至少16字节,再加上一个指针8个字节,总共24字节。也就是说,为了存储这个20而需要24字节,对内存方面是极大的浪费。 -
性能浪费
为了存储和访问一个NSNumber
对象,需要在堆上为其分配内存,另外还要维护它的引用计数,管理生命期。这些都给程序增加了额外的逻辑,造成运行效率上的损失。
Tagged Pointer技术
为了解决这个问题,苹果提出了Tagged Pointer的概念。
从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString
等小对象的存储。引入后,相关逻辑能减少一半的内存占用,以及 3 倍的访问速度提升,100 倍的创建、销毁速度提升。
- 原理
将数据 直接存储在指针中。当指针不够存储数据时,才会使用动态分配内存的方式来存储数据。
也就是使用Tagged Pointer之后,
NSNumber
指针里面存储的数据变成了:Tag + Data
,
objc_msgSend()
函数能识别Tagged Pointer,比如NSNumber
的intValue
方法,直接从指针提取数据,节省了以前的调用开销。
之前,
NSNumber
等对象需要动态分配内存、维护引用计数等,NSNumber
指针存储的是堆中NSNumber
对象的地址值。
网友评论