老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

iOS源碼閱讀必備知識之TaggedPointer

Tagged Pointer 介紹

10多年的山亭網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整山亭建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯建站從事“山亭網站設計”,“山亭網站推廣”以來,每個客戶項目都認真落實執行。

蘋果對于Tagged Pointer特點的介紹:

  • Tagged Pointer專門用來存儲小的對象,例如NSNumber和NSDate
  • Tagged Pointer指針的值不再是地址了,而是真正的值。所以,實際上它不再是一個對象了,它只是一個披著對象皮的普通變量而已。所以,它的內存并不存儲在堆中,也不需要malloc和free。
  • 在內存讀取上有著3倍的效率,創建時比以前快106倍。

為什么要引入Tagged Pointer

iPhone5s 采用64位處理器。對于64位程序,我們的數據類型的長度是跟CPU的長度有關的。

iOS源碼閱讀必備知識之Tagged Pointer

這樣就導致了 一些對象占用的內存會翻倍。

同時 維護程序中的對象需要 分配內存,維護引用計數,管理生命周期,使用對象給程序的運行增加了負擔。

Tagged Pointer

為了改進上面提到的內存占用和效率問題,蘋果提出了Tagged Pointer對象。由于NSNumber、NSDate一類的變量本身的值需要占用的內存大小常常不需要8個字節,拿整數來說,4個字節所能表示的有符號整數就可以達到20多億(注:2^31=2147483648,另外1位作為符號位),對于絕大多數情況都是可以處理的。

我們可以將一個對象的指針拆成兩部分,一部分直接保存數據,另一部分作為特殊標記,表示這是一個特別的指針,不指向任何一個地址。所以,引入了Tagged Pointer對象之后,64位CPU下NSNumber的內存圖變成了以下這樣:

Tagged Pointer

iOS源碼閱讀必備知識之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指針在編譯時會報錯。

如圖:

iOS源碼閱讀必備知識之Tagged Pointer

提示我們改為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 , 對象的值是指針指向的內存區域中的值

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對創新互聯的支持。


分享名稱:iOS源碼閱讀必備知識之TaggedPointer
標題路徑:http://www.xueling.net.cn/article/gpdeij.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产高清在线精品 | 草久视频免费观看 | 国产成人在线播放免费视频 | 日本中文字幕一区二区 | 好爽又高潮了毛片一区二区 | 日韩精品中文字幕一区二区 | 欧美xxxx日本和非洲 | 少妇性饥渴姓交HDSEX | 国产精品无码免费热播 | 夜夜爱夜夜操 | 精品国产男人的天堂久久 | 国产女同2互磨高潮在线观看 | 超碰97人人做人人爱亚洲 | 久操精品视频 | 日本一级特黄高潮 | 亚洲涩导航 | 日韩精品一区二区视频 | 欧美午夜寂寞影院 | 国产精品视频福利 | 婷停五月深爱五月 | 亚洲色av天天天天天天 | 黄色大片播放 | xxxxxx在线| 国产视频一区二区在线播放 | av高清在线观看 | 老师开裆丝袜喷水视频 | 人妖一区二区三区 | 国产日韩欧美东南在线 | 成人精品一区二区91毛片不卡 | 欧美精品18videos性欧美 | 日韩成人av影院 | 91涩涩视频 | 久久综合九色综合网站 | 国产亚洲AV片在线观看播放 | 女的被弄到高潮娇喘喷水视频 | 成年人在线免费观看热视频 | 龙珠z中文版普通话 | 亚洲第一精品在线 | av无码免费岛国动作片片段 | 上课被cao的好爽高潮免费视频 | a级毛片免费全部播放无码 一区二区在线免费观看视频 |