在编写应该在 32 位和 64 位机器上都可移植的代码时,应牢记哪些要点?
对此进行更多思考,我觉得如果您可以根据所面临的问题添加您的经验,那将有所帮助。
进一步补充说,我曾经遇到过一个问题,原因是缺少返回指针的函数原型。当我将它移植到 64 位机器上时,代码崩溃了,我很长一段时间都不知道原因,后来意识到所有丢失的原型都假定返回导致问题的 int。
任何这样的例子都会有所帮助。
编辑:添加到社区维基。
在编写应该在 32 位和 64 位机器上都可移植的代码时,应牢记哪些要点?
对此进行更多思考,我觉得如果您可以根据所面临的问题添加您的经验,那将有所帮助。
进一步补充说,我曾经遇到过一个问题,原因是缺少返回指针的函数原型。当我将它移植到 64 位机器上时,代码崩溃了,我很长一段时间都不知道原因,后来意识到所有丢失的原型都假定返回导致问题的 int。
任何这样的例子都会有所帮助。
编辑:添加到社区维基。
在 Windows 上,只有 x64 上的调用约定,而不是常规 x32 机器上的倍数。
当您拥有一些 32 位和一些 64 位的组件时,事情会变得更加模糊。在 Windows 上,我最终编写了一个 COM 服务来让他们说话。
将指针压入堆栈会占用两倍的空间。但是,堆栈大小可能不会在 OS 版本之间发生变化,导致在 32 位中运行良好的代码在编译并在 64 位上运行时会神秘地失败。别问我怎么知道的。
sizeof(int) 可能!= sizeof(void*)
结盟。对齐需求可能会发生变化。这可能会暴露错误,您一直在错误处理应该对齐但只是在 32 位(或在不关心的处理器上)意外对齐的东西
如果接收者需要一个指针,则不要将 0 传递给可变参数。这在 C++ 中很痛苦,精明的开发人员知道 0 是一个有效的空指针。AC dev 通常会使用 NULL 所以你可能没问题
陷阱:
我发现一些有用的提示和技巧:
typedef
您自己的),并在您有不关心大小的变量时使用它。编写自动化测试并在两个平台上定期运行它们。