2013-09-11 28 views
9

現在有一個iPhone 64位架構。 long變成了64位(而int仍然是32位),並且到處使用NSInteger現在是long,所以64位不是32.並且twitter有不少人說:「我很高興我已經使用NSInteger到處不是int「。NSInteger應該到處使用嗎?

如果你需要存儲一個不超過32位的值(例如在一個只循環25次的循環中),爲什麼應該使用一個long,因爲32位(至少)高位將會空着。

如果程序在32位整數上工作,那麼使用64位整數提供什麼好處,當它佔用更多的內存?

同樣會出現使用64位整數給出使用32位整數的不同結果的情況。因此,如果您使用NSInteger,那麼iPhone 5S上可能會有某些功能,但不會在較舊的設備上使用,而如果明確使用了int或long,那麼結果在任何設備上都是相同的。

回答

-1

NSInteger的內部存儲可以是多種不同支持類型之一,這就是爲什麼您可以在任何地方使用它並且無需擔心它,這就是它的全部要點。

1

如果你需要存儲一個不超過32位的值......爲什麼要長時間使用它?

如果你真的可以做出這樣的保證,那麼絕對沒有理由在32位上評估64位類型。對於有界循環,計數器和一般算術等簡單操作,32位整數就足夠了。但對於更復雜的操作,尤其是那些需要高性能應用程序的應用程序(如執行音頻或圖像處理的應用程序),處理器在64位模式下處理的數據量的增加非常顯着。

如果程序在32位整數上工作,那麼使用64位整數提供什麼好處,當它佔用更多內存?

你使用更多的內存看起來像一件壞事。通過將一些數據類型的大小加倍,可以將它們發送到內存中更多的地方,並且可以解決的內存越多,OS加載代碼的時間就越少。此外,在處理器總線中數據通道數量的兩倍相當於可以一次處理多個數量級的數值,並且寄存器大小的增加意味着數據量可以保持在一個數量級以上一個註冊。簡而言之,這等同於大多數應用程序的幾乎自動加倍速度。

此外,還會出現使用64位整數給出使用32位整數的不同結果的情況嗎? ...

是的,但不是你想的方式。 32位數據類型和操作以及64位操作(大多數是用軟件模擬的,或者由32位主機中的特殊硬件或操作碼模擬的)在尺寸上都是「相對穩定的」。由於不同的編譯器實現了64位數據類型的不同版本(請參閱LP64, SILP64, and LLP64),因此無法在64位體系結構上提供接近的保證。實際上,這意味着將64位類型轉換爲32位類型(比如說指向int的指針)會保證導致信息丟失,但在保證爲64位的兩種數據類型之間進行轉換 - 指針和長整型在LP64上 - 是可以接受的。 ARM通常使用LP64進行編譯(所有入口都是32位,所有長都是64位)。同樣,大多數開發人員不應該受到開關的影響,但是當您開始處理您嘗試以整數存儲的任意大數字時,精度就成了問題。

因此,我建議在公共接口中使用NSUInteger和NSInteger,以及沒有固有邊界檢查或溢出警衛的API。例如,TableView請求NSUInteger數據量不是因爲它擔心32位和64位數據結構,而是因爲它不能保證它所編譯的體系結構。蘋果試圖讓架構無關的數據類型實際上有點奢侈,因爲考慮到你的代碼在兩種架構中編譯和「正常工作」所需做的工作量很小。

+1

你的第二個回答「你使用更多的內存看起來像一件壞事」正是我一直在尋找的答案。不幸的是,由於我沒有計算機科學背景,它完全在我頭上。有沒有一個例子可以說明如何在64位空間中存儲數字「3」實際上加快了應用程序的速度?我同意喬納森的看法,這似乎是對空間的巨大浪費,而且效率非常低下。 –

+0

這與「MOV」指令完全相同。這不是導致加速的任意小操作,而是處理器總線上可以傳輸的數據量,這會導致差異。這類似於擁有4車道高速公路而不是2車道,然後試圖舉行怪物卡車拉力賽。你可以安裝更多的小型數據(比如普通汽車),並且可以擠進那些大卡車,而不必依靠將數據截斷並依次運行。 – CodaFi

+1

好啊,類比。我喜歡。所以用你的比喻,是不是使用「長」來表示一小部分,就像駕駛一輛只有一個孤獨的小孩在後面的大巴士一樣?它佔用與包裝公交車相同數量的空間,但額外的空間被浪費了。 (再次想到,也許這個比喻讓我感到困惑。)我覺得我並沒有抓住一些非常基本的東西,但似乎即使它是完全相同的'MOV'指令,'MOV'存儲在64位空間的長度是存儲在32位空間中的兩倍? –

-1

如果您的應用程序在32位或64位引擎上運行,並且使用宏將__LP64__宏轉換爲正確的數據類型,Apple會考慮向後兼容性。

#if __LP64__ 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 
+2

這是我的問題的整個觀點... –

+0

NSInteger爲您提供始終可用的操作系統中可訪問的「最大」可能整數數據類型 - iOS7之前和之後。而這個宏只是照顧你的操作系統版本。您總是被鼓勵使用「最小」的數據類型,這對您的特定問題是有意義的。在iOS7之前和之後,你肯定'可以'以32位整數和64位的形式存儲一個布爾值。 – XcodeJunkie