编写可移植到 32 位和 64 位体系结构的代码时需要考虑的要点
-
20-09-2019 - |
题
编写在 32 位和 64 位机器上都可移植的代码时应牢记哪些要点?
对此进行更多思考,我觉得如果您能根据所面临的问题添加您的经验,那会有所帮助。
除此之外,我曾经遇到过一个问题,因为返回指针的函数缺少原型。当我将其移植到 64 位机器时,代码崩溃了,很长一段时间我都不知道原因,后来意识到所有丢失的原型都被假定返回 int 导致问题。
任何这样的例子都会有所帮助。
编辑:添加到社区维基。
解决方案
陷阱:
- 将指针强制转换为整数类型是危险的
- 数据结构大小可以改变
- 注意标志延伸
- 不同的 ABI?
我发现一些有用的提示和技巧:
- 为自己获取一个本机大小的整数类型(来自标头或
typedef
你自己的)并在你有不关心大小的变量时使用它。 - 尽可能使用显式变量类型(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,所以你很可能确定
收件自动测试,并定期两个平台上运行它们。
不隶属于 StackOverflow