如何编写同时兼容 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 位的代码?的主要内容,如果未能解决你的问题,请参考以下文章