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

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

有帮助吗?

解决方案

选项:

用某种语言对其进行编码 虚拟机 (例如Java)

在 .NET 中对其进行编码,并且不针对任何特定的体系结构。这 .NET JIT 编译器 会在运行之前将其编译为正确的架构。

其他提示

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

或者选择一种解释语言。

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

为了确保编写可移植的代码,您应该一直做同样的事情:)

火狐指南常见问题解答 是很好的起点

我假设你还在谈论 编译 他们分别针对每个单独的平台?因为只需创建 32 位二进制文​​件即可在两者上运行它们。

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

但这个问题确实没有适当的“与语言无关”的答案。如果您将自己限制在标准“C”或“C++”之类的东西,您甚至无法得到特别确定的答案 - 数据存储、指针等的大小都非常依赖于实现。

老实说,这取决于语言,因为 C# 和 Java 之类的托管语言或 JavaScript、Python 或 PHP 之类的脚本语言都被锁定在其当前的方法论中,并且要开始使用并执行高级操作之外的任何操作,无需担心太多。

但我的猜测是,您问的是 C++、C 和其他较低级语言等语言。

您需要担心的最重要的事情是事物的大小,因为在 32 位世界中,您只能使用 2^32 的幂,但在 64 位世界中,事物会变得更大 2^64。

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

在 C(也许还有 C++)中,在计算 malloc 的缓冲区大小时,始终记住使用 sizeof 运算符。这样您无论如何都可以编写更可移植的代码,并且这将自动考虑 64 位数据类型。

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

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

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

这就是为什么如此多的程序员在他们最可移植的程序中使用 typedef 的原因 - 如果您希望您的代码能够在从 8 位处理器到 64 位处理器的所有处理器上运行,您需要认识到,无论如何,在 C 中, int 并不是严格定义的。

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

——亚当·戴维斯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top