编写在 32 位和 64 位机器上都可移植的代码时应牢记哪些要点?

对此进行更多思考,我觉得如果您能根据所面临的问题添加您的经验,那会有所帮助。

除此之外,我曾经遇到过一个问题,因为返回指针的函数缺少原型。当我将其移植到 64 位机器时,代码崩溃了,很长一段时间我都不知道原因,后来意识到所有丢失的原型都被假定返回 int 导致问题。

任何这样的例子都会有所帮助。

编辑:添加到社区维基。

有帮助吗?

解决方案

陷阱:

  1. 将指针强制转换为整数类型是危险的
  2. 数据结构大小可以改变
  3. 注意标志延伸
  4. 不同的 ABI?

我发现一些有用的提示和技巧:

  1. 为自己获取一个本机大小的整数类型(来自标头或 typedef 你自己的)并在你有不关心大小的变量时使用它。
  2. 尽可能使用显式变量类型(u_int64_t、int_32_t 等)

其他提示

  • 某些整数类型可能具有不同的大小
  • 指针的长度不同
  • 结构填充
  • 结盟

在 Windows 上,只有 x64 上的调用约定,而不是常规 x32 计算机上的多个调用约定。

当您拥有一些 32 位组件和一些 64 位组件时,事情会变得更加模糊。在 Windows 上,我最终编写了一个 COM 服务来让它们进行对话。

指针推到堆栈上占据了两倍的空间。堆栈大小可能不操作系统版本之间虽然发生变化,从而导致在32位运行正常编译和运行在64位不变时,神秘的失败代码。不要问我是怎么知道的。

的sizeof(int)的威力!=的sizeof(无效*)

对准。它可能比对需求可能会改变。这暴露了Bug,你已经被虐待本来应该一致,但偶然在32位只对准东西(或对不关心的处理器)

不传递0到可变参数,如果接收器期待的指针。这是用C ++的痛苦精明的地方开发者知道0是一个有效的空指针。 A C开发通常会使用NULL,所以你很可能确定

收件自动测试,并定期两个平台上运行它们。

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