如何编写同时兼容 32 位和 64 位的代码?

Posted

技术标签:

【中文标题】如何编写同时兼容 32 位和 64 位的代码?【英文标题】:How do you write code that is both 32 bit and 64 bit compatible? 【发布时间】:2010-09-07 03:32:06 【问题描述】:

如果我希望我的代码在 32 位和 64 位平台上都能正常运行,我需要考虑哪些因素?

编辑:我需要注意哪些方面,例如打印字符串/字符或使用结构?

【问题讨论】:

【参考方案1】:

选项:

使用Virtual Machine(例如Java)以某种语言对其进行编码

在 .NET 中对其进行编码,并且不针对任何特定架构。 .NET JIT compiler 会在运行之前为您编译到正确的架构。

【讨论】:

【参考方案2】:

一种解决方案是针对在两个平台上运行的虚拟环境(我在想 Java,或者这里是 .Net)。

或者选择一种解释语言。

您还有其他需求,例如调用现有代码或库吗?

【讨论】:

【参考方案3】:

你应该一直做同样的事情来确保你编写可移植的代码:)

mozilla guidelines 和 C faq 是很好的起点

【讨论】:

【参考方案4】:

我假设您还在为每个单独的平台单独讨论编译它们?因为只需创建一个 32 位二进制文​​件就可以在两者上运行它们。

【讨论】:

【参考方案5】:

最重要的是确保不要将指针放入 32 位存储位置。

但是对于这个问题,确实没有正确的“语言不可知论”答案。如果您将自己限制在标准的“C”或“C++”之类的东西上,您甚至无法得到一个特别明确的答案——数据存储、指针等的大小都非常依赖于实现。

【讨论】:

【参考方案6】:

老实说,这取决于语言,因为 C# 和 Java 等托管语言或 javascript、Python 或 php 等脚本语言都被锁定在他们当前的方法中,并且要开始并做任何超出高级内容的事情,没有太多担心。

但我猜你问的是像 C++、C 和其他低级语言这样的语言。

您最需要担心的是事物的大小,因为在 32 位世界中,您受限于 2^32 的幂,而在 64 位世界中,事物会变得更大 2^64。

使用 64 位,您可以在 RAM 中拥有更大的内存和存储空间,并且可以计算更大的数字。但是,如果您知道自己正在为 32 位和 64 位进行编译,则需要确保将您对系统的期望限制在 32 位世界以及缓冲区和数字的限制。

【讨论】:

【参考方案7】:

在 C(可能还有 C++)中,在计算 malloc 的缓冲区大小时,请务必记住使用 sizeof 运算符。这样一来,您将编写更多可移植的代码,这将自动考虑 64 位数据类型。

【讨论】:

【参考方案8】:

在大多数情况下,您唯一需要做的就是为两个平台编译代码。 (这是假设您使用的是编译语言;如果不是,那么您可能无需担心任何事情。)

我能想到的唯一可能导致问题的事情是假设数据类型的大小,这可能是您无论如何都不应该做的事情。当然,任何用汇编语言编写的东西都会引起问题。

【讨论】:

【参考方案9】:

请记住,许多编译器根据底层架构选择整数的大小,因为“int”应该是系统中最快的数字操纵器(根据一些理论)。

这就是为什么这么多程序员在他们最可移植的程序中使用 typedef 的原因——如果你希望你的代码在从 8 位处理器到 64 位处理器的所有东西上工作,你需要认识到,无论如何,在 C 中,int 没有严格定义.

指针是另一个需要小心的地方——如果你在摆弄指针的数值,不要使用 long、long long 或任何特定类型——使用正确的构造,不幸的是,它因编译器而异到编译器(这就是为什么你为每个你使用的编译器都有一个单独的 typedef.h 文件)。

-亚当·戴维斯

【讨论】:

以上是关于如何编写同时兼容 32 位和 64 位的代码?的主要内容,如果未能解决你的问题,请参考以下文章

32位和64位的区别

如何在64位windows7上同时使用32位和64位的Eclipse

office32位和64位的区别,用户如何选择

如何使代码兼容 32 位和 64 位

C#如何使用SQLite数据库兼容32位,64位系统

为 Windows 编写跨平台(32 位和 64 位兼容)程序(如 .NET 中的 AnyCPU)