2009-07-08 112 views

回答

4

假设没有COM组件,P/Invoke等安全代码,应该没有语义差异,但性能可能会受到影响。考虑:64位内存更多,但引用更大。赢得一些,输掉一些。

无论如何,这里有一些有用的参考资料:

“[...]考虑一个.NET应用程序 是100%安全的代码在这种情况下 有可能采取您在 运行 .NET可执行文件。 32位机器并将其移动到 64位系统,并使其成功运行 为什么它可行? 由于程序集是100%类型安全的 我们知道在本机代码或COM对象上没有依赖项 并且 没有'不安全'的代码,这意味着 该应用程序在CLR的控制下完全运行 。在CLR 保证,而作为 刚刚在时间(JIT)编译的结果所产生的二进制代码 将32位和64位之间 不同, 执行该代码都将是 语义一样。 [...]”

+1

理论上的应用将会运行相同,实际上在实现方面存在差异,32位和64位框架之间也存在不同的错误,这种情况并不常见,但确实发生了。在过去的2个月中,我遇到过至少3种情况,其中相同的MSIL在定位x86时的行为与在x64系统上定位AnyCPU时的行为不同。 – 2009-07-21 03:38:15

6

如果应用程序的目标是AnyCPU,则运行时行为将会有所不同,特别是内存使用情况和限制。

在64位上,不会有相同的32位内存限制(理论上2GB最大内存,实际上是1.2-1.6)。但是,所有的对象引用都是两倍,所以64位系统会使用更多的内存。

此外,64位系统通常有额外的寄存器等,所以有时性能可能会略有提高。不过,这是特定于平台的。

如果应用程序的目标是x86,它将在WoW64下运行,并且与它在32位系统中的行为方式几乎完全相同。

4

除了那些由Reed Copsey识别的方法之外,另一种方式可能是如果你的“纯粹”应用程序碰巧使用了System.IntPtr结构体,或者它使用了不安全的代码(这不是一回事作为P/Invoke)和指针算术。

另一个值得关注的重点是召唤几乎所有System.Runtime.InteropServices.Marshal类的东西。有各种各样的令人敬畏的方式在那里拍摄自己的脚(当然,当你需要它时非常有用)。

+0

良好补充 – 2009-07-08 00:44:16

相关问题