随着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》。

如何为iPhone 5s编译64位应用相关推荐

  1. iOS 7: 如何为iPhone 5S编译64位应用

    转载自 http://blog.csdn.net/keyboardota/article/details/11993883 随着 iPhone 5S的推出,大家开始关心 5S上所使用的 64位CPU ...

  2. iOS 7: 如何为iPhone 5S编译64位应用。

    http://blog.csdn.net/keyboardota/article/details/11993883 点击打开链接 随着 iPhone 5S的推出,大家开始关心 5S上所使用的 64位C ...

  3. [转]如何为iPhone 5S编译64位应用。

    转自:http://blog.csdn.net/keyboardota/article/details/11993883 随着iPhone 5S的推出,大家开始关心5S上所使用的64位CPU A7. ...

  4. VS中编译64位程序以及遇到的问题(E0000235)

    安装64位操作系统不是编译64位程序的必要条件,关键是要装64位程序的编译器. 1. 选择"Build" – "Configuration Manager"菜单 ...

  5. Windows下VS2015 MPI编译64位Boost1.64

    Windows下VS2015编译64位Boost1.64 2017年12月08日 15:51:48 阅读数:346 参考原帖:https://gist.github.com/UnaNancyOwen/ ...

  6. Windows7_x64下编译64位ffmpeg

    一点心青的文章指导得非常详细,本应是非常顺利的.但我仍然为编译64位ffmpeg耽误了很久,现在总结一下经验教训: 1. 经验:在编译SDL的时候,我直接使用了1.2.5的版本,省去了很多麻烦: 2. ...

  7. VS2013编译64位boost流程及若干问题

    为了编译CGAL库,必须要先编译boost,在编译64位库时遇到了一些问题,主要解决办法是: 1. 选择VS2013安装目录下的"x64兼容命令提示"命令行对话框: 2. 切换到b ...

  8. gdal1.6linux编译,VS2015下编译64位GDAL总结

    使用VS2015编译最新的64位GDAL(最新gdal2.11),确实有一些问题,看来双方还是太新了,有点不兼容,特总结如下. 以前经常用的通过VisualStudio IDE进行编译的方式现在似乎不 ...

  9. 使用MSYS2编译64位gvim

    1. 下载安装MSYS2 在https://msys2.github.io/下载MSYS2,推荐下载x86-64版,此版本内置了MinGW32与MinGW64 安装后首先更新MSYS2系统,顺序执行下 ...

最新文章

  1. 分享6 个值得收藏的 Python 代码
  2. 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...
  3. mysql数据库入门教程(12):变量讲解大全
  4. 关于WebService中用到的QName详解
  5. lambda中orElse(null)使用
  6. Yahoo Programming Contest 2019 自闭记
  7. 2017-2018-1 20155339 《信息安全系统设计基础》第三周学习总结
  8. svm分类代码_SVM的原理及实现垃圾邮件分类代码解析:
  9. 帆软按钮Javascript给某个单元格赋值(例:逻辑删除)
  10. 计算机应用水平excel考什么,全国专业技术人员计算机应用能力考试EXCEL2003中文字处理全真模拟试卷(三)...
  11. Android自定义控件学习
  12. arccatalog点要素显示不完_2020年仅剩100天,你的年假休完了吗?关于年假你不知道的7点!...
  13. 洛谷 U87052 一线天
  14. Rabbitmq使用优先级队列实现消息插队
  15. Confluence: A Robust Non-IoU Alternative to Non-Maxima Suppression in Object Detection 论文阅读翻译
  16. 数学之英文写作——基本中英文词汇(一般术语、算术与代数的常用词汇)
  17. 拿到offer后,我死死的抓着他们不放
  18. linux修改配置文件configure,./configure 的配置和用法
  19. DRF-视图类APIView与GenericAPIView
  20. java小游戏大鱼吃小鱼入门(15min写一个小游戏)

热门文章

  1. CnOpenData·A股上市公司关联交易数据
  2. 解决安卓微信无法调用相机
  3. 流技术安全系统-流量流向监控技术
  4. UML图和软件设计原则
  5. Kafka配置详解-Consumer配置
  6. 【分享】Ubuntu桌面版图形界面下换源
  7. 百里挑一,这四款良心软件,好用到你不想卸载
  8. JDBC BaseRowSet类和CachedRowSet类
  9. 我要每人送一块高端鼠标垫,包邮…
  10. C# WPF框架下 Console.WriteLine()无法打印内容