深入Tagged Pointer

Tagged Pointer是一個(gè)能夠提升性能断傲、節(jié)省內(nèi)存的有趣的技術(shù)

其實(shí)早在在2013年9月织堂,蘋(píng)果推出了iPhone5s,與此同時(shí)徐矩,iPhone5s配備了首個(gè)采用64位架構(gòu)的A7雙核處理器粮宛,為了節(jié)省內(nèi)存和提高執(zhí)行效率,蘋(píng)果提出了Tagged Pointer的概念卖宠。對(duì)于64位程序巍杈,引入Tagged Pointer后,相關(guān)邏輯能減少一半的內(nèi)存占用扛伍,以及3倍的訪(fǎng)問(wèn)速度提升筷畦,100倍的創(chuàng)建、銷(xiāo)毀速度提升刺洒。

問(wèn)題

我們先看看原有的對(duì)象為什么會(huì)浪費(fèi)內(nèi)存鳖宾。假設(shè)我們要存儲(chǔ)一個(gè)NSNumber對(duì)象,其值是一個(gè)整數(shù)逆航。正常情況下鼎文,如果這個(gè)整數(shù)只是一個(gè)NSInteger的普通變量,那么它所占用的內(nèi)存是與CPU的位數(shù)有關(guān)因俐,在32位CPU下占4個(gè)字節(jié)拇惋,在64位CPU下是占8個(gè)字節(jié)的。而指針類(lèi)型的大小通常也是與CPU位數(shù)相關(guān)抹剩,一個(gè)指針?biāo)加玫膬?nèi)存在32位CPU下為4個(gè)字節(jié)撑帖,在64位CPU下也是8個(gè)字節(jié)。

所以一個(gè)普通的iOS程序澳眷,如果沒(méi)有Tagged Pointer對(duì)象胡嘿,從32位機(jī)器遷移到64位機(jī)器中后,雖然邏輯沒(méi)有任何變化钳踊,但這種NSNumber衷敌、NSDate一類(lèi)的對(duì)象所占用的內(nèi)存會(huì)翻倍。如下圖所示:

image.png

我們?cè)賮?lái)看看效率上的問(wèn)題箍土,為了存儲(chǔ)和訪(fǎng)問(wèn)一個(gè)NSNumber對(duì)象逢享,我們需要在堆上為其分配內(nèi)存,另外還要維護(hù)它的引用計(jì)數(shù)吴藻,管理它的生命期瞒爬。這些都給程序增加了額外的邏輯,造成運(yùn)行效率上的損失。

Tagged Pointer

為了改進(jìn)上面提到的內(nèi)存占用和效率問(wèn)題侧但,蘋(píng)果提出了Tagged Pointer對(duì)象矢空。由于NSNumber、NSDate一類(lèi)的變量本身的值需要占用的內(nèi)存大小常常不需要8個(gè)字節(jié)禀横,拿整數(shù)來(lái)說(shuō)屁药,4個(gè)字節(jié)所能表示的有符號(hào)整數(shù)就可以達(dá)到20多億(注:2^31=2147483648,另外1位作為符號(hào)位)柏锄,對(duì)于絕大多數(shù)情況都是可以處理的酿箭。

所以我們可以將一個(gè)對(duì)象的指針拆成兩部分,一部分直接保存數(shù)據(jù)趾娃,另一部分作為特殊標(biāo)記缭嫡,表示這是一個(gè)特別的指針,不指向任何一個(gè)地址抬闷。所以妇蛀,引入了Tagged Pointer對(duì)象之后,64位CPU下NSNumber的內(nèi)存圖變成了以下這樣:

image.png

TaggedPointer只是一個(gè)偽指針

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笤成,一起剝皮案震驚了整個(gè)濱河市评架,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炕泳,老刑警劉巖纵诞,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異培遵,居然都是意外死亡挣磨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)荤懂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茁裙,“玉大人,你說(shuō)我怎么就攤上這事节仿∥钭叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵廊宪,是天一觀(guān)的道長(zhǎng)矾瘾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)箭启,這世上最難降的妖魔是什么壕翩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮傅寡,結(jié)果婚禮上放妈,老公的妹妹穿的比我還像新娘北救。我一直安慰自己,他們只是感情好芜抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布珍策。 她就那樣靜靜地躺著,像睡著了一般宅倒。 火紅的嫁衣襯著肌膚如雪攘宙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天拐迁,我揣著相機(jī)與錄音蹭劈,去河邊找鬼。 笑死线召,一個(gè)胖子當(dāng)著我的面吹牛链方,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灶搜,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼工窍!你這毒婦竟也來(lái)了割卖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤患雏,失蹤者是張志新(化名)和其女友劉穎鹏溯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淹仑,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丙挽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匀借。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颜阐。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吓肋,靈堂內(nèi)的尸體忽然破棺而出凳怨,到底是詐尸還是另有隱情,我是刑警寧澤是鬼,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布肤舞,位于F島的核電站,受9級(jí)特大地震影響均蜜,放射性物質(zhì)發(fā)生泄漏李剖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一囤耳、第九天 我趴在偏房一處隱蔽的房頂上張望篙顺。 院中可真熱鬧偶芍,春花似錦、人聲如沸慰安。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)化焕。三九已至萄窜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撒桨,已是汗流浹背查刻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凤类,地道東北人穗泵。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谜疤,于是被迫代替她去往敵國(guó)和親佃延。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容