當前位置:首頁 » 代碼百科 » Tagged股票代碼
擴展閱讀
商用汽車的股票代碼 2025-06-21 22:05:52
華映科技股票是賣還是留 2025-06-21 21:49:53

Tagged股票代碼

發布時間: 2021-05-23 10:18:03

『壹』 ARX匿名化演算法代碼

造成圖像模糊的原因很多,你要處理的是哪一種?不可能滿足所有要求的

『貳』 nstaggedpointerstring類型怎麼取值

Tagged Pointer是一個能夠提升性能、節省內存的有趣的技術。在OS X 10.10中,NSString就採用了這項技術,現在讓我們來看看該技術的實現過程。本話題由Ken Ferry提出。

回顧

對象在內存中是對齊的,它們的地址總是指針大小的整數倍,通常為16的倍數。對象指針是一個64位的整數,而為了對齊,一些位將永遠是零。

Tagged Pointer利用了這一現狀,它使對象指針中非零位有了特殊的含義。在蘋果的64位Objective-C實現中,若對象指針的最低有效位為1(即奇數),則該指針為Tagged Pointer。這種指針不通過解引用isa來獲取其所屬類,而是通過接下來三位的一個類表的索引。該索引是用來查找所屬類是採用Tagged Pointer的哪個類。剩下的60位則留給類來使用。

Tagged Pointer有一個簡單的應用,那就是NSNumber。它使用60位來存儲數值。最低位置1。剩下3位為NSNumber的標志。在這個例子中,就可以存儲任何所需內存小於60位的數值。

從外部看,Tagged Pointer很像一個對象。它能夠響應消息,因為objc_msgSend可以識別Tagged Pointer。假設你調用integerValue,它將從那60位中提取數值並返回。這樣,每訪問一個對象,就省下了一次真正對象的內存分配,省下了一次間接取值的時間。同時引用計數可以是空指令,因為沒有內存需要釋放。對於常用的類,這將是一個巨大的性能提升。

NSString似乎並不適合Tagged Pointer,因為它的長度即可變,又可遠遠超過60位。然而,Tagged Pointer是可以與普通類共存的,即對一些值使用Tagged Pointer,另一些則使用一般的指針。例如,對於NSNumber,大於2^60-1的整數就不能採用Tagged Pointer來存儲,而需要在內存中分配一個NSNumber的對象來存儲。只要創建對象的代碼編寫正確,就沒有問題。

NSString也是如此。對於那些所需內存小於60位的字元串,它可以創建一個Tagged Pointer。其餘的則被放置在真正的NSString對象里。這使得常用的短字元串的性能得到明顯的提升。實際代碼就是如此嗎?似乎Apple是這么認為的,因為他們這么做了並實現了它。

可能的實現方法

在看Apple的實現之前,讓我們花點時間想想我們自己會如何實現這種字元串。最初想法很簡單:置最低位為1,剩下的3位作為類的標志,60位為真正的數據。如何使用這60位是一個大問題。我們想要最大限度地利用這60位。

一個Cocoa字元串在概念上是一系列的Unicode字元。一共有1,112,064個有效的Unicode字元,所以需要21位代表一個字元。這意味著我們可以放兩個字元在這60位里,浪費掉了18位。我們可以用一些額外的位來存儲長度。所以一個採用Tagged Pointer的字元串可以是零個、一個或兩個字元。然而被限制為只有兩個字元的字元串似乎並沒什麼用。

NSString API實際上是基於UTF-16的實現,而不是直接基於Unicode。UTF-16用16位的序列值來表示Unicode。最常見的基本多文種平面(Basic Multilingual Plane,BMP)字元需要16位,字元編碼超過65,535的則需要兩個。我們可以放三個16位進60位,剩下12位。再借用一些表示長度的位,這將允許我們表示0-3個UTF-16字元。這將允許三個BMP字元,且其中一個字元可以超出BMP的范圍。被限制為三個字元的字元串的使用仍然有限。

大多數APP里的字元串是ASCII。即使APP本地化到非ASCII語言,字元串也遠遠不止用於顯示UI。它們用於URL組件、文件擴展名、對象鍵、屬性列表值等等。UTF-8編碼是一種ASCII兼容的編碼,它將每一個ASCII字元編碼為一個位元組,用四位元組編碼其他Unicode字元。我們可以在60位里放七個位元組,剩下的4位表示長度。這樣這種字元串可以存儲七個ASCII字元,或者少一些的非ASCII字元,這取決於這些字元是什麼。

如果我們要優化ASCII,我們不妨放棄對Unicode的完整支持。畢竟包含非ASCII字元的字元串可以使用真正的NSString對象。ASCII是一個七位編碼,如果我們給每個字元只分配7位會發生什麼?讓我們存儲八個ASCII字元在這60位里,再用剩下的4位存儲長度。這聽起來很有用。在一個APP里可能有大量的字元串是純ASCII並且只包含8個字元或更少。

接著往下想,完整的ASCII里有很多不常用的東西。比如一堆控制字元和不常用的符號。字母和數字才是最常使用的。我們能不能把編碼縮短到6位?

6位可以存儲64個不同的值。ASCII里有26個字母,算上大寫小寫則有52個,再加上數字0-9則多達62個。如果說有兩個地方需要節省,那就是空間和時間。可能有很多隻包含這些字元的字元串。每6位1個位元組,我們可以在60位里存儲十個字元!等等!我們沒有剩餘空間存儲長度。所以要麼我們存儲9個字元加長度,要麼在那64個不同值里刪除一個(我認為可以刪除空格),然後對於那些小於10個字元的字元串使用零作為結束符。