Categories
程式開發

iOS內存管理之Tagged Pointer


1 背景

iPhone5s是首個採用64 位架構的A7雙核處理器的手機,為了節省內存和提高執行效率,蘋果提出了Tagged Pointer的概念。對於64 位程序,引入Tagged Pointer 後,相關邏輯能減少一半以上的內存佔用,以及3倍的訪問速度提升,100 倍的創建、銷毀速度提升。

本文將帶我們來理解這個概念是怎麼節省內存和提高執行效率的。 (注:本篇文章所用系統皆為64位系統)

2 不使用Tagged Pointer的情況

以NSNumber *a = @(1);為例,在不使用Tagged Pointer的情況下,我們看下在內存上和訪問效率上都是什麼情況。

在內存上:

如下圖所示, 1個小對象需要至少使用24字節(指針8字節+ 對象16字節)

棧:在棧上,佔1個指針8字節,裡面存儲的是堆內存的地址0x600001a92920。

堆:在堆上,佔16個字節,isa指針佔8個字節,1為int類型,佔4個字節,但由於內存對齊機制(ios 內存對齊為16字節),堆需要16個字節的內存。

iOS內存管理之Tagged Pointer 1

在效率上:

NSNumber對象需要動態分配內存、維護引用計數、管理它的生命週期等

方法調用需要objc_msgSend的執行流程(消息發送、動態方法解析、消息轉發)

原文鏈接:【https://www.infoq.cn/article/R5s0BudUKwYNDAfrIVh4】。未經作者許可,禁止轉載。