歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS 7: 如何為iPhone 5S編譯64位應用

隨著 iPhone 5S的推出,大家開始關心 5S上所使用的 64位CPU A7。

除了關心A7的性能以外,大家還會關心一個問題,那就是使用A7的64位系統對應用有沒有什麼要求。特別是應用開發者,大家都比較關心我們的應用如何遷移到64位的系統上來,以充分發揮A7的能力。其實這些問題都可以在蘋果的官方文檔《64-Bit transition Guide for Cocoa Touch》中找到答案。

為了大家方便,我將《64-Bit transition Guide for Cocoa Touch》中的一些重點整理了一下,希望可以為大家節約一些詳細閱讀文檔的時間,如果我理解有不對的地方請大家指正。

首先,A7使用的是ARM V8架構,除了使用64位的地址總線和64位的寄存器以外,還增加了寄存器的數量,目前A7中的整數和浮點數寄存器是A6的兩倍。

這裡需要強調的是,寄存器的增加大大提高了程序的運行速度。將CPU由32位提高到64位,最主要的改變增大了尋址能力,可以突破32位系統只能訪問3G內存的限制(感謝  wanglang3081 指出這裡的問題,32位系統在理論上可以訪問4G內存,因為2的32次方約等於4 290 000 000,很多32位系統只能訪問3G左右的內存是因為有一大部分地址被分配給I/O系統了,所以總體可用內存就不足4G了。),但是,32位到64位的改變並不一定意味著程序運行速度的提高,甚至有些情況下會因為64位系統中的數據占用內存變大而導致程序運行速度變慢。而寄存器數量的增加,則直接提高了程序運行速度,當然,前提是你的應用需要重新為64位系統編譯一遍,讓程序可以充分使用所有的寄存器。

使用Xcode 5可以很方便地將以前的應用編譯成64位程序,基本過程如下:

1. 使用Xcode 5 打開原有項目。

2. 將支持的設備改成“iOS 7”。

3. 在“Build Setting”中將“Architectures”改成“Standard Architectures (including 64-bit)”。

4. 運行測試程序,解決編譯過程出現的問題。

其中第4步是關鍵,具體會遇到什麼問題和原來程序的設計有關,包括使用數據類型的方式是否標准等,後面會繼續討論細節,其實《64-Bit transition Guide for Cocoa Touch》一書主要就是講這些細節。

在討論細節之前有一些較為宏觀的內容大家可以了解一下。

Xcode 5編譯的iOS 7程序包含了32位和64位兩套二進制代碼,在32位的iOS系統上會調用32位的二進制代碼,在64位系統上會調用64位的二進制代碼,以此來解決向後兼容的問題。

同時,考慮到很多32位的程序可能在沒有重新編譯的情況下部署到64位系統上,64位的iOS系統中帶有兩套FrameWork,一套是32位的,一套是64位的。

當64位的iOS系統運行原來的32位程序時,系統會調用32位的FrameWork作為底層支撐,當系統運行64位程序時,系統會調用64位的FrameWork作為底層支撐。

也就是說,當一個iPhone 5S上同時運行32位程序和64位程序時,系統同時將32位和64位兩套FrameWork載入了內存中,所以消耗的內存也比較多。

如果一台64位的iOS設備上運行的所有程序都是為64位系統編譯過的,iOS系統將只載入64位的FrameWork,這將節省好多內存。所以,如果大家都可以快速將程序傳換成64位的,iOS將跑得更快。真的是“大家好才是真的好”。

後面我們來看看一些為64位系統調整程序的技術細節。

32位的iOS系統和64位的iOS系統主要的差別有兩個,一個是 數據類型 的差別,一個是 過程調用 方法 的差別。

在 數據類型 上,主要的變化是指針類型(Pointer)和長整數類型(long)的長度變化和內存對齊方式的變化,同時也導致了更高級別數據類型的變化,如NSInteger的長度也有變化。

在 過程調用方法 上,因為ARM V8 和ARM V7具有不同數量的寄存器,具有不同的過程調用約定,所以32位系統和64位系統在匯編層級是不同的。

Copyright © Linux教程網 All Rights Reserved