随着
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位系统在汇编层级是不一样的。
根据以上两方面的变化,书中总结了如下要点,开发人员根据如下要点来检查原来的32位代码就差很少能够将应用移植到64位系统上了:
1. 不要将长整型数据(long)赋予整型(int)
这种代码在32位系统上没有问题,由于在32位系统中long和int的长度是同样的,不过在64位系统中就有可能出问题,由于64位系统中long比int长,将long值赋予int将致使数据丢失。
2. 不要将指针类型(Pointer)赋予整型(int)
为了方便地址计算,有时程序员会将指针类型赋予整型,这种代码在32位系统上没有问题,由于在32位系统中Pointer和int的长度是同样的,不过在64位系统中就会有问题,由于64位系统中Pointer比int长,将Pointer值赋予int将致使地址数据丢失,最终致使严重问题。
3. 留意那些和数位相关的数值计算
好比掩码技术,若是使用一个long类型的掩码,转到64位系统后高位都是0,计算出来的结果可能不符合预期。还有无符号整数和有符号整数的混用等。
4. 留意对齐方式带来的变化
若是在32位系统上定义一个结构包含两个long类型,第二个long数值的偏移地址是4,能够经过结构地址+4的方式获取,可是在64位系统上就不行了,由于在64位系统中第二个long数值的偏移地址是8。
5. 充分考虑在32位应用和64位应用之间的数据交换
由于用户会经过网络交换数据,同时用户保存的数据也可能经过备份等方式在32位系统和64位系统之间切换,因此应用在保存和发送流数据的时候必定要考虑充分。好比数据在32位系统中保存,在64位系统中可否正常打开,或者反过来,在64位系统中保存,在32位系统中打开是否正常。
6. 重写全部汇编代码
这点无需说明,若是你在代码中嵌入了汇编代码,你须要参考64位系统的指令集重写汇编代码。
7. 不要将可变参数的过程强制转换为定参过程,也不要将定参过程强制转换为可变参数的过程。
这时由于32位系统和64位系统对于这两种过程调用方式的处理方法不一样。
按以上几个重点去检查程序就差很少了,固然,具体的细节还有不少,须要在实际工做中结合代码和调试结果进行分析。
总之,建议具体负责应用迁移的开发者须要完整阅读《64-Bit transition Guide for Cocoa Touch》。