armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别
ARM處理器指令集
一. 蘋果模擬器指令集:
| 指令集 | 分析 |
| i386 | 針對intel通用微處理器32架構的 |
| x86_64 | 針對x86架構的64位處理器 |
| i386|x86_64 | 是Mac處理器的指令集,i386是針對intel通用微處理器32架構的。x86_64是針對x86架構的64位處理器。 |
? ??模擬器并不運行arm代碼,軟件會被編譯成x86可以運行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用于在模擬器運行,另一個是在真實設備上運行的,然后再用命令將兩個.a合并成一個(1+1=1)。
二.蘋果設備指令集相關
| 32位ARM | armv6、armv7、armv7s |
| 64位ARM | arm64、armv8 |
| 蘋果A7處理器支持兩個不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(`arm64 | armv8`)。 |
| armv6 設備 | iPhone, iPhone2, iPhone3G; 第一代、第二代 iPod Touch |
| armv7 設備 | iPhone3GS, iPhone4, iPhone4S;? iPad, iPad2, iPad3(The New iPad), iPad mini; iPod Touch 3G, iPod Touch4 |
| armv7s設備 | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
| ARMv8/arm64設備 | iPhone5S,iPhone6s(plus)、iPhoneSE,iPhone7(plus) iPad Air, iPad mini2(iPad mini with Retina Display) |
三. 蘋果模擬器、設備指令集總結
| x86 (i386、x86_64) | arm (armv6、armv7、armv7s、armv8、armv64) |
當使用iOS模擬器的時候會遇到i386|x86_64,iOS模擬器沒有arm指令集,編譯運行的是x86指令集,所以,只有在iOS設備上,才會執行設備對應的arm指令集。
四. XCode中與指令集相關
XCode中關于生成二進制包指令集相關的設置項有以下三個:
圖.xcode設置
| Architecture | 指你想支持的指令集 | 該選項指定了工程將被編譯成支持哪些指令集。 如果支持的指令集數目有多個,就會編譯出包含多個指令集代碼的數據包,從而會造成最終編譯生成的包很大。 |
| Valid architectures | 指即將編譯的指令集 | 該選項指定可能支持的指令集,該Valid architectures列表和Architectures列表的交集,將是Xcode最終生成二進制包所支持的指令集 限制可能被支持的指令集的范圍 例如:Valid Architectures設置的支持arm指令集有:armv7/armv7s/arm64,對應的Architectures設置的支持arm指令集有:armv7s,這時Xcode只會生成一個armv7s指令集的二進制包 |
| Build Active Architecture Only | 該編譯項用于設置是否只編譯當前使用的設備對應的arm指令集。 | 使用條件: ①其值設置為YES; ②XCode成功連接調試設備;(必須同時滿足才會起作用)Xcode中設置: ①設置為Yes, 編譯速度更快,它只編譯當前的architecture版本; ②設置為No,編譯速度更慢會編譯所有的版本 例如:當該選項設置成YES時,你連上一個armv7指令集的設備(iPhone5、5c),就算你的Valid Architectures和Architectures都設置成armv7/armv7s/arm64,還是依然只會生成一個armv7指令集的二進制包。 |
假定:我們將Build Active Architecture Only值設置為YES,同時Xcode連接上手機iPhone5S匹配指令集arm64)。如下五種情況總結如下表:
| 情況① | armv7、 armv7s、 arm64 | armv6、 armv7s、 arm64 | arm64 | 因為:取交集arm64和 armv7s,但iPhone5S匹配指令集arm64, 所以:為arm64 |
| 情況② | armv6、 armv7、 armv7s | armv6、 armv7s、 arm64 | armv7s | 因為:取交集armv6和armv7s,但iPhone5S匹配指令集arm64,但同時支持armv7s,同時XCode4.5開始,就不再支持armv6指令集 所以:為arm64 |
| 情況③ | armv6 armv7 | armv6、 armv7s、 arm64 | armv7 | 無交集。但是因為:ValidArchitectures支持armv7s則必然支持armv7,Architectures支持armv7,從XCode4.5開始,就不再支持armv6指令集。所以:最終生成二進制指令集armv7 |
| 情況④ | armv6 | armv6、 armv7s、 arm64 | <br />無響應 | 雖然編譯成功了,但是并沒有任何目標生成。 因為從XCode4.5開始,就不再支持armv6指令集,所以列表中寫了也是白寫。 |
| 情況⑤ | armv7、 armv7s、 arm64 | armv7、 armv7s | error報錯 | 生成二進制包支持的指令集編譯出錯error信息: No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 |
- 分析:
- 當Build Active Architecture Only起作用時:連接的手機指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
- 指令集都是可以向下兼容的
比如,你的設備是armv7s指令集,那么它也可以兼容運行比armv7s版本低的指令集:armv7、armv6
xcode對armv6指令集的支持 - Xcode4.5起不再支持armv6。
如何選擇支持的指令集?
如果你的軟件對安裝包大小非常敏感,你可以減少安裝包中的指令集數據包,而且這能達到立竿見影的效果。
很久前xcode支持的指令集是armv7/armv7s,后來改成只支持armv7后,比原來小了10MB左右。目前AppStore上的一些知名應用,比如百度地圖、騰訊地圖通過反匯編工具查看后,也都只支持armv7指令集。
根據向下兼容原則,armv7指令集的應用是可以正常在支持armv7s/arm64指令集的機器上運行的。
不過對于armv7s/arm64指令集設備來說,使用運行armv7應用是會有一定的性能損失,不過這種損失有多大缺乏權威統計數據,不會影響用戶體驗的。
建議:Valid Architectures通常Debug模式設置值為Yes,Release模式設置為No
參考鏈接:
1.armv6, armv7, armv7s的區別
2.Apple移動設備處理器指令集 armv6、armv7、armv7s及arm64
3.Xcode設置項之Architectures和Valid Architectures
4.iOS工程如何支持64-bit
總結
以上是生活随笔為你收集整理的armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua 阿拉伯数字转大写(一)
- 下一篇: Pascal VOC 2012数据集下载