Tagged Pointer 介紹
蘋果對于Tagged Pointer特點的介紹:
為什么要引入Tagged Pointer
iPhone5s 采用64位處理器。對于64位程序,我們的數據類型的長度是跟CPU的長度有關的。

這樣就導致了 一些對象占用的內存會翻倍。
同時 維護程序中的對象需要 分配內存,維護引用計數,管理生命周期,使用對象給程序的運行增加了負擔。
Tagged Pointer
為了改進上面提到的內存占用和效率問題,蘋果提出了Tagged Pointer對象。由于NSNumber、NSDate一類的變量本身的值需要占用的內存大小常常不需要8個字節,拿整數來說,4個字節所能表示的有符號整數就可以達到20多億(注:2^31=2147483648,另外1位作為符號位),對于絕大多數情況都是可以處理的。
我們可以將一個對象的指針拆成兩部分,一部分直接保存數據,另一部分作為特殊標記,表示這是一個特別的指針,不指向任何一個地址。所以,引入了Tagged Pointer對象之后,64位CPU下NSNumber的內存圖變成了以下這樣:
Tagged Pointer

測試
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSNumber *number1 = @1;
NSNumber *number2 = @2;
NSNumber *number3 = @3;
NSNumber *numberFFFF = @(0xFFFF);
NSNumber *numberLager = @(MAXFLOAT);
NSLog(@"number1 pointer is %p", number1);
NSLog(@"number2 pointer is %p", number2);
NSLog(@"number3 pointer is %p", number3);
NSLog(@"numberLager pointer is %p", numberLager);
/*
2017-03-10 12:07:50.731726 TaggedPoint[1690:50438] number1 pointer is 0x127
2017-03-10 12:07:50.731992 TaggedPoint[1690:50438] number2 pointer is 0x227
2017-03-10 12:07:50.732011 TaggedPoint[1690:50438] number3 pointer is 0x327
2017-03-10 12:07:50.732043 TaggedPoint[1690:50438] numberLager pointer is 0x1002006a0
*/
}
return 0;
}
以 0x127 為例 去掉 tag27(假設27為標記) 0x1 就是number 的值。
0x227
0x327
都有這種規律
numberLager 存儲的值為MAXFloat 顯然超過了tagged pointer 可以存儲的范圍。
所以打印的地址是單純的指針地址,指向存儲numberLager的內存地址。
對于isa指針的影響
因為tagged pointer 不是一個真正的對象,如果使用isa指針在編譯時會報錯。
如圖:

提示我們改為object_getClass()
object_getClass()中做了相應的處理
由于object_getClass()沒有對應的實現,只能從其他地方窺探一二
objc-weak.mm
weak_read_no_lock(weak_table_t *weak_table, id *referrer_id)
{
objc_object **referrer = (objc_object **)referrer_id;
objc_object *referent = *referrer;
if (referent->isTaggedPointer()) return (id)referent;
//...
}
inline bool
objc_object::isTaggedPointer()
{
#if SUPPORT_TAGGED_POINTERS
return ((uintptr_t)this & TAG_MASK);
#else
return false;
#endif
}
這里取對象的值做了一些判斷
如果是tagged pointer , 對象的值就是指針
如果非tagged pointer , 對象的值是指針指向的內存區域中的值
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。