美文网首页
Tagged Pointer简介

Tagged Pointer简介

作者: Arthur澪 | 来源:发表于2020-03-12 09:27 被阅读0次

前言

从一句代码说起: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,比如NSNumberintValue方法,直接从指针提取数据,节省了以前的调用开销。

之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。

相关文章

网友评论

      本文标题:Tagged Pointer简介

      本文链接:https://www.haomeiwen.com/subject/umvkbqtx.html