| |
更多内存更好性能 Windows64位软件开发 |
|
时间: 2006-02-08 来自:天极开发 |
 |
|
通用语言运行时库(CLR)的变化
CLR已经作了内部的修改以支持64位计算,在很大程度上,此修改涉及到代码生成、垃圾回收、例外处理、和调试等等。
·代码生成。64位版本的CLR需支持64位本地应用程序的开发,这通常意味着对每一个新平台,都必须重新构建一个Just-In-Time(JIT)编译器,也就是大家所看到的IA64与x64平台。
·垃圾回收。64位处理器可寻址更大的内存,突破了32位系统中存在的4GB内存界限。因此,垃圾回收机制也必须作相应修改,以支持更大的内存。
·例外处理。在对最终用户的使用方法保持不变的前提下,64位系统的例外处理已经彻底修改并重写。
·调试。调试器依赖于代码生成与例外处理子系统,因为一旦这两个子系统变了,调试器也必须跟着改变。
开发工具
在Visual
Studio 2005中,Visual C++ .NET、Visual C#、Visual Basic .NET已经支持64位应用程序的开发,而作为Visual
Studio 2005另一个组成部分的Visual J#却不支持。图9描述了在Visual Studio
2005中对不同语言的支持,及这些托管语言所支持的平台环境。
 图9:Visual Studio
2005中的语言及平台支持 | Visual Studio
2005集成开发工具仍会作为32位程序发布,并在WOW64系统下运行。大多数在32位平台上具有的功能,在64位平台上同样也具有,但要注意的是,此处没有"编辑并继续(Edit
and Continue)"功能。
除了Visual Studio 2005,Windows Platform
SDK同样也提供了64位编译器工具集,其中包含了一个可用于开发64位应用程序的Visual
C++编译器。
预防性措施
在开发64位本地应用程序之前,有必要弄清楚:我们到底应采取哪些步骤,以保证今天的程序将来可移植到64位?
在此,可参考以下一些预防性措施或使用一些工具,例如,Visual
C++编译器支持/Wp64选项,以探测当前代码中存在的潜在移植性问题。
另外,在Visual Studio
2005的集成开发环境中,还有一个类似的工具--FxCop,通过在FxCop中加入一些规则,便可在编译时探测到移植性问题。
在托管语言方面,以下情况涉及到移植性问题:
·涉及COM
Interop与平台调用的Interop相关代码:本地64位程序不能加载32位COM
DLL,这就是说,一个64位的进程不能转变为32位代码,并在同一进程中成为一个32位DLL的宿主程序;不同处理器架构间的Interop也不能在同一进程中做到这一点。因此,当一个64位程序必须要调用COM
DLL时,此COM DLL最好也是64位的。
·在许多情况中,这些COM
DLL是第三方代码,所以你可能没有源代码。如果这样的话,程序就必须针对x86架构重新构建,并且运行于WOW64子系统中。还有一个解决的办法,在另一个单独的32位进程中加载此32位的DLL,由64位程序对此进行RPC调用。
·浮点数的相等比较。不能保证同一IL中间语言代码在32位与64位平台上有相同的结果,因此,推荐不要直接进行浮点数的相等比较。浮点数在64位计算机上的表示法基于IEEE-754标准,其允许差分计算,这会对那些对精度要求非常高的金融程序与图形程序带来很大的影响,必须重新设计算法以应对此问题。有关更多信息,请参考:http://docs.sun.com/source/806-3568/ncg_goldberg.html
·使用StructLayout属性对结构数据排列方式的显式控制。属性StructLayout可应用于结构和类,当它被显式地指定时,必须精确地控制非托管内存中对象的每一个成员的位置。相对于32位平台,因为数据类型长度有所变化,所以结构的打包也有所不同,因此,必须避免显式地控制结构的排列方式。
·对数字的位操作。C#提供了位操作符,包括了AND、OR、左移位和右移位操作符。对数据类型的位操作,在32位与64位计算机上会有所变化,这是因为平台间数据类型的内部表示方法会有所不同。
·自定义串行化。
.NET
Framework对串行化提供了两个选项--通过使用Serializable属性实现自动串行化,或对类型实现ISerializable接口达到自定义串行化的目的。当使用
.NET
Freamwork提供的最基本的串行化机制时,不会发生什么问题,然而,当通过ISerializable实现自定义串行化时,得出的结果会因为32位与64位平台而有所不同,具体依赖于为实现自定义串行化而采用的方法。
当然,也许程序中会多次用到涉及上述的功能,在这种情况下,必须分别构建和测试32位与64位版本的程序。
|
|
|
|
|
|
|
|