3

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

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

进一步补充说,我曾经遇到过一个问题,原因是缺少返回指针的函数原型。当我将它移植到 64 位机器上时,代码崩溃了,我很长一段时间都不知道原因,后来意识到所有丢失的原型都假定返回导致问题的 int。

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

编辑:添加到社区维基。

4

5 回答 5

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

在 Windows 上,只有 x64 上的调用约定,而不是常规 x32 机器上的倍数。

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

于 2010-02-12T18:41:28.943 回答
3

将指针压入堆栈会占用两倍的空间。但是,堆栈大小可能不会在 OS 版本之间发生变化,导致在 32 位中运行良好的代码在编译并在 64 位上运行时会神秘地失败。别问我怎么知道的。

于 2010-02-12T18:43:00.300 回答
3

sizeof(int) 可能!= sizeof(void*)

结盟。对齐需求可能会发生变化。这可能会暴露错误,您一直在错误处理应该对齐但只是在 32 位(或在不关心的处理器上)意外对齐的东西

如果接收者需要一个指针,则不要将 0 传递给可变参数。这在 C++ 中很痛苦,精明的开发人员知道 0 是一个有效的空指针。AC dev 通常会使用 NULL 所以你可能没问题

于 2010-02-12T18:47:59.410 回答
2

陷阱:

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

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

  1. 为自己获取一个原生大小的整数类型(来自标头或typedef您自己的),并在您有不关心大小的变量时使用它。
  2. 尽可能使用显式变量类型(u_int64_t、int_32_t 等)
于 2010-02-12T18:40:19.893 回答
2

编写自动化测试并在两个平台上定期运行它们。

于 2010-02-12T18:43:41.863 回答