首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>更快、更强 64位编程的三十二条军规

更快、更强 64位编程的三十二条军规

2005-11-16 17:28作者:谢启东出处:天极开发责任编辑:方舟

  需要思考的事

  14、为了充分发挥64位处理器的性能,还必须有一个64位操作系统。当前Linux/Unix操作系统的各种变体层出不穷,包括Red Hat、SUSE、Sun、Turbolinux甚至Apple(Mac OS X)都发布了数款力作,此时对Windows用户来言,他们的选择非常有限。迄今为止,Microsoft也只是发布了Windows XP Professional x64 Edition 和 Windows Server 2003 x64 Edition的英文版。

  15、与大众看法相反的是,64位处理器对加密程序来说,并不会有太大的帮助。据《Secrets and Lies》作者——安全专家Bruce Schneier说法,现今的加密手段已经足够快了,“如果只是从两毫秒减少到一毫秒,有什么意义吗?64位处理器不会对大多数的加密手段带来一个质的改变。”

  16、对于32位和64位系统,是否分别发给用户不同的二进制文件,完全取决于你优化代码的方法。举例来说,只是针对Apple G5而简单重编译的代码,不会在老版本的G4上工作得很好,但如果为了G5处理器特定的功能,而对代码作了修改,你将不得不提供一份单独的二进制文件。解决这个问题的最好办法是,在执行特定于某种处理器的代码之前,先作一个判断,看当前的处理器是否匹配,但这也有不利之处,因为生成的二进制文件将会更大。

  17、可以只使用一种系统来开发多个平台的程序。例如,使用GCC,你可在一个64位的AMD64平台上,同时生成32位x86应用程序和64位AMD64应用程序,生成32位程序时,只需要在编译器中带上“-m32”。

  相关的编译器

  18、当为程序速度作优化时,经常不得不牺牲可移植性,这通常意味着硬件生产商提供的编译器比GNU的编译器,能生成更快的可执行代码。“GCC是一款优秀的编译器产品,但生成代码的质量,在很大程度上依赖于对特定处理器的细微调整,”SUSE公司的Jaeger说到,“比如说,在安腾(Itanium)处理器上,Intel的编译器通常能生成更好的代码;但在AMD64处理器上,目前保持最高SPECint值的代码,仍是由GCC编译器生成的。”

  19、在为G5处理器优化代码方面,Apple公司为OS X 10.3操作系统的每个版本,都免费提供了它的Xcode Tools套件。这个开发工具包,包括一个集成开发环境(IDE)、一个用户界面生成器、一个调试器和一个专为G5作过优化的GCC 3.3版的编译器。

  20、如果为Athon 64和Opteron系列作开发,AMD公司推荐使用Microsoft的编译器。Linux用户通过使用GCC,也能得到令人满意的效果。

  21、在安腾(Itanium)系统上,你可使用Intel C++编译器来为那些C/C++源码生成高度优化的64位可执行代码。Intel公司针对Linux和Windows操作系统分别有不同的编译器版本,两者售价均为399美元。这里也有一些第三方的编译器产品,其中有Microsoft、HP、IBM,甚至SGI的,如果Linux用户要使用GCC编译器,最好先看一下第18条。

  22、如果要在UltraSPARC处理器上开发和优化代码,Sun公司提供了Sun ONE Studio开发套件,售价大约一千美元。

  23、在Unix系统上,ILP32(整型int、长整型long、指针pointer)数据模型对64位应用程序不再适用。如果你之前在写程序时,已假定所有的int、long、指针的长度都是32比特,那么现在必须要掉转头来重写一遍,因为此时long和指针的长度已是64比特(LP64)。特定要提醒的是,要仔细检查一切有关int、long、指针的赋值和比较语句。

  24、在64位Windows系统上,long的长度依然是32比特,但指针和long long是64位,这被称作LLP64模型。

  25、把64比特的指针值转换为32比特的int(或Windows上的32比特的long),将导致严重的后果。特别是在为32位和64位平台书写不同代码时,如果使用通用数据类型,就能避免这个问题。比如说,你正在Windows平台上使用C/C++,如果想存储一个指针值,那么INT_PTR将比int更加好;而在Linux系统上,这种类型是intptr_t。使用此类的通用数据类型将确保变量有足够的比特位来放下指针地址,而不管使用的是什么处理器。

  26、要在常量表达式中指定数据类型。如果你想使一个常量为long,必须清楚地在数值后跟上l或者L,否则,编译器有可能把它当作int来对待。

  27、多留意设备驱动程序。如果你的应用程序是跟随设备驱动程序一同分发,或者与第三方的驱动程序有交互,那么要谨记,代码必须为64位对象而重新编译。当然,如果你或者第三方开发者在写驱动程序时就使用的是ILP32数据模型,那么必须及时更新,以使用LP64或LLP64模型,参见第23和24条。

  28、小心C语言中的符号扩展问题。举例来说,当转换一个unsigned int到64位的unsigned long时,它必须先转换成一个signed int,然后是signed long,最后才能转换成unsigned long。在此期间,任何数值超过2的31次方的int值,将会被系统当成一个负数,而负号也会扩展到因转换成long而新增的32个比特位中,最后被转换成的unsigned long数值,将会比原值大许多。

  29、当从32位到64位时,数据对齐方式也会有所改变。就如一个变量在一个架构上是四字节对齐,而到了另一个上面就成了八字节对齐。一些程序员为了避免这个问题,只是简单地使用了一些结构,然而,对那些需要创建动态结构或者执行一次就过的操作来说,知道此时如何处理可变对齐方式是非常重要的。一个解决方法是,避免把数据大小和偏移量编码成一个常量,而应使用C语言中的sizeof操作符来确定数据大小。

  30、如果你的64位程序将会运行在Linux系统上,那么系统中必须装有64位库,通常这些库被安装于以/lib64结尾的路径下,以便与32位库区分开来。(注意,在DEC Alpha和Itanium处理器上,没有32位库,而64位库就在/lib目录下。)

  31、Windows XP Professional x64 Edition和Windows Server 2003 x64 Edition允许运行32位及64位应用程序;然而,它们只有64位库。所有32位指令都通过被称为WOW64的x86仿真层传递,它负责把相应指令转换成对64位库的调用。

  向前冲!

  32、在为64位处理器优化软件时并不难,所需做的仅是知道什么要注意、什么要避免。唯一要记住的是,也许程序移植到64位平台之后,并不会有性能上的提升,但总好过什么都不做。

关注此文的读者还看过:

返回开发频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络