我们如何编写同时兼容32位和64位的代码?
如果我想让我的代码在32位和64位平台上正常运行,我需要考虑什么?
编辑:我需要注意哪些区域,例如打印字符串/字符或者使用结构?
解决方案
回答
我认为我们仍在谈论针对每个平台分别进行编译吗?在两者上运行它们完全可以通过仅创建32位二进制文件来实现。
回答
最大的一件事是确保不要将指针放到32位存储位置。
但是,实际上,这个问题没有适当的"与语言无关"的答案。如果我们将自己限制在诸如标准" C"或者" C ++"之类的数据存储,指针等大小都完全取决于实现的情况下,我们甚至都无法得到明确的答案。
回答
一种解决方案是针对同时在两个平台上运行的虚拟环境(我在这里使用Java或者.Net)。
或者选择一种解释性语言。
我们还有其他要求,例如调用现有代码或者库吗?
回答
我们应该一直做的相同的事情,以确保我们编写可移植的代码:)
Mozilla准则和C常见问题解答是很好的起点
回答
老实说,这取决于语言,因为诸如Cand Java之类的托管语言或者诸如JavaScript,Python或者PHP之类的脚本语言已被锁定在当前的方法论之中,并且可以开始使用和执行除高级功能之外的任何操作,因此无需担心。
但是我的猜测是我们正在询问有关C ++,C和其他较低级语言的语言。
我们需要担心的最大事情就是事情的大小,因为在32位世界中,我们只能使用2 ^ 32的幂,但是在64位世界中,事情变得更大,即2 ^ 64.
使用64位时,我们可以在RAM中有更大的存储空间和存储空间,并且可以计算更大的数字。但是,如果我们知道同时针对32和64进行编译,则需要确保将对系统的期望限制为32位世界,并限制缓冲区和数字的数量。
回答
选项:
使用虚拟机(例如Java)以某种语言对其进行编码
在.NET中对其进行编码,并且不针对任何特定的体系结构。 .NET JIT编译器将在运行之前为我们编译正确的体系结构。
回答
在C语言(可能还有C ++)中,在为malloc计算缓冲区大小时,请始终记住使用sizeof运算符。这样,无论如何我们将编写更多可移植的代码,并且这将自动考虑64位数据类型。
回答
在大多数情况下,我们要做的就是为两个平台编译代码。 (这是假设我们使用的是编译语言;如果不是,则我们可能不必担心任何事情。)
我唯一想到的可能会导致问题的是假设数据类型的大小,无论如何我们可能都不应该这样做。当然,任何用汇编语言编写的内容都会引起问题。
回答
请记住,鉴于" int"应该是系统中最快的数字操纵器(根据某些理论),许多编译器都是根据基础体系结构选择整数的大小。
这就是为什么要让代码在从8位处理器到64位处理器的所有代码上运行的情况下,那么多的程序员在大多数可移植程序中使用typedef的原因,我们需要认识到,无论如何,在C中int并不是严格定义的。
指针是另一个要注意的地方,如果我们对指针的数值不满意,请不要使用long或者long long或者任何特定类型。为什么我们使用的每个编译器都有单独的typedef.h文件)。
-亚当·戴维斯(Adam Davis)