转自:http://blog.csdn.net/keyboardota/article/details/11993883
随着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》。

转载于:https://www.cnblogs.com/xyzaijing/p/4045174.html

[转]如何为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位应用

    随着iPhone 5S的推出,大家开始关心5S上所使用的64位CPU A7. 除了关心A7的性能以外,大家还会关心一个问题,那就是使用A7的64位系统对应用有没有什么要求.特别是应用开发者,大家都比较 ...

  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. pyecharts中管理工具按钮以及修改图表主题
  2. Boost:bind绑定的unique_ptr测试程序
  3. SQLite 入门教程(一)基本控制台(终端)命令
  4. Hadoop 集群搭建
  5. 列出Sell in application所有可以传输的application object
  6. Small Multiple(AtCoder-3621)
  7. a标签的href属性
  8. [bug解决] cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘
  9. wordpress mysql port_Kubernetes
  10. 构建五种机器学习模型作比较(某金融数据集)
  11. 服务器上的VGA切换原理,浅谈笔记本中VGA信号切换的原理
  12. OpwnWrt 路由器MWAN3多线多拨实现方法
  13. Facebook反爬虫注册策略分析及养号实战
  14. 4、docker中设置elasticsearch、kibana用户名密码、修改密码
  15. 微信防撤回python_python实现微信防撤回神器
  16. 如何在 ggplot2 中制作饼图(附示例)
  17. php 处理png图片白色背景色改为透明色
  18. 基于springboot+bboss整合的elasticsearch(好用的一匹)
  19. PBR:基于物理的渲染(Physically Based Rendering)+理论相关
  20. 颁奖 | 获奖名单又来惹~!有你咩?

热门文章

  1. Rapidshare-video-tutorial
  2. Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数
  3. 计算机cmd测试命令,常见CMD网络诊断命令
  4. 安卓微信修改分享来源,小尾巴,支持qq 头条 uc 浏览器
  5. 2022年胡润中国珠宝品牌排行榜:周大福满分位居榜首,老凤祥成立时间最长(附年榜TOP50详单)
  6. 【求职】完美世界Java 方向面经
  7. 生成黑白棋盘标定图和单目相机标定(一)(python+opencv实现)
  8. 如何动手做一个属于自己的网页——HTML基础知识总结
  9. linux 性能测试 antutu,安兔兔评测Linux版已经上线,官方透露Windows版本有望下个月登场...
  10. linux下如何开发php,在linux下开发PHP,用哪个系统?该如何解决