armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别

2024-04-18 04:48

本文主要是介绍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)。

二.苹果设备指令集相关

位数指令集
32ARMarmv6armv7armv7s
64ARMarm64armv8
苹果A7处理器支持两个不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(`arm64armv8`)。
指令集支持设备
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)iPhoneSEiPhone7(plus)

iPad Air, iPad mini2(iPad mini with Retina Display)

三. 苹果模拟器设备指令集总结

模拟器设备

x86

(i386x86_64

arm

(armv6armv7armv7sarmv8armv64

当使用iOS模拟器的时候会遇到i386x86_64,iOS模拟器没有arm指令集,编译运行的是x86指令集,所以,只有在iOS设备上,才会执行设备对应的arm指令集

四. XCode中与指令集相关

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 ArchitecturesArchitectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包。

假定:我们将Build Active Architecture Only值设置为YES,同时Xcode连接上手机iPhone5S匹配指令集arm64)。如下五种情况总结如下表:

情况ArchitecturesValidArchitectures结果分析
情况①armv7、
armv7s
arm64
armv6、
armv7s
arm64
arm64

因为:取交集arm64armv7s,但iPhone5S匹配指令集arm64

所以:为arm64

情况②armv6
armv7、
armv7s
armv6
armv7s
arm64
armv7s

因为:取交集armv6armv7s,但iPhone5S匹配指令集arm64,但同时支持armv7s,同时XCode4.5开始,就再支持armv6指令集

所以:为arm64

情况③armv6
armv7
armv6、
armv7s、
arm64
armv7无交集。但是因为:ValidArchitectures支持armv7s则必然支持armv7,Architectures支持armv7,从XCode4.5开始,就再支持armv6指令集。所以:最终生成二进制指令集armv7
情况④armv6armv6、
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
    xcodearmv6指令集的支持
  • Xcode4.5再支持armv6

如何选择支持的指令集

如果你的软件对安装包大小非常敏感,你可以减少安装包中的指令集数据包,而且这能达到立竿见影的效果。

很久前xcode支持的指令集是armv7/armv7s,后来改成只支持armv7后,比原来小了10MB左右。目前AppStore上的一些知名应用,比如百度地图、腾讯地图通过反汇编工具查看后,也都只支持armv7指令集。

根据向下兼容原则,armv7指令集的应用是可以正常在支持armv7s/arm64指令集的机器上运行的。

不过对于armv7s/arm64指令集设备来说,使用运行armv7应用是会有一定的性能损失,不过这种损失有多大缺乏权威统计数据,不会影响用户体验的。

建议:Valid Architectures通常Debug模式设置值为YesRelease模式设置为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区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913799

相关文章

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

深入探讨:ECMAScript与JavaScript的区别

在前端开发的世界中,JavaScript无疑是最受欢迎的编程语言之一。然而,很多开发者在使用JavaScript时,可能并不清楚ECMAScript与JavaScript之间的关系和区别。本文将深入探讨这两者的不同之处,并通过案例帮助大家更好地理解。 一、什么是ECMAScript? ECMAScript(简称ES)是一种脚本语言的标准,由ECMA国际组织制定。它定义了语言的语法、类型、语句、

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因