64位平台编程

Posted

技术标签:

【中文标题】64位平台编程【英文标题】:Programming for the 64 bit platform 【发布时间】:2008-11-11 08:24:43 【问题描述】:

在开发 .Net 应用程序(比如 Asp.Net 应用程序)时,与在 32 位平台上工作相比,在 64 位平台上工作时的处理方式有什么不同吗?

我想的很少,因为您正在开发框架,而框架正在为您处理大部分事情,对吧?

但是,请给你的cmets。

谢谢。

【问题讨论】:

【参考方案1】:

如果您使用的是 p/invoke,那么您需要确保您有 64 位版本的 DLL 可用。如果您调用 MS 提供的 DLL,例如 kernel32,这不是问题,因为它们在 32 位和 64 位平台上具有相同的名称(我知道这很奇怪),因此您的 64 位应用程序将隐式链接到正确的版本。但是,如果您使用的是 3rd 方 DLL,并且您的 64 位应用程序尝试链接到 32 位 DLL,您将获得运行时异常。

这也意味着,如果您使用的是进程内 COM 对象,您就会遇到问题。当您跨进程边界移动时,64 位应用程序可以调用 32 位的进程外 COM 对象(反之亦然),COM 将为您处理编组。

除此之外,框架会为您处理大部分事情。您永远不必担心指针大小,并且 clr 类型具有明确的大小(int 始终为 32 位,long 始终为 64 位)。在纯粹的 .NET 世界中,几乎没有什么可担心的。当您开始在沙盒之外移动时,您必须更加小心。

【讨论】:

【参考方案2】:

在两种情况下考虑 64 位可能会很有趣:

    您需要考虑具有超过 2^31 个元素的容器。标准数组 .Length 属性返回 Int32,因此无法表示大型数组 - 无论如何您都无法在 32 位 VM 中创建。在 64 位 VM 中,您应该改用 LongLength(除非您知道您的元素少于 2^31 个)。不幸的是,许多标准集合类似乎根本不支持大量元素。 您可以使用对性能的担忧较少的 long 类型:在 64 位版本中,long 适合寄存器,而在 32 位版本中,JIT 代码将需要多个机器指令来执行单个 long 操作.

【讨论】:

以上是关于64位平台编程的主要内容,如果未能解决你的问题,请参考以下文章

利用Code::Blocks搭建64位C++开发平台

32位平台代码向64位平台移植

平台及架构

32/64位平台printf uint64的方法

如何通过脚本检测64位平台

cmake跨平台编译之判断操作系统平台32位64位系统