【问题标题】:Migrating from 64 bit to 32 bit从 64 位迁移到 32 位
【发布时间】:2014-08-13 03:02:45
【问题描述】:
我有一个致力于 64 位架构的项目。
现在我希望将其迁移到 32 位系统。它利用INT64 指针操作。我应该对当前系统进行哪些更改?一些解释可能需要进行的一般更改的示例将很有帮助。
PS:运行代码时会抛出错误"Invalid address specified to RtlValidateHeap( 004F0000, 02A90EB8 )",有时会抛出错误"Critical error detected c0000374"。
我用谷歌搜索了这两个错误,但找不到解决方法。
【问题讨论】:
标签:
c++
migration
64-bit
32bit-64bit
【解决方案1】:
将 x64 应用程序从一个位迁移到另一个位(Windows 平台)时要记住的一些事项
-
假设指针大小为 8,检查每个 sizeof()
pointer = (INT64) (other_pointer + sizeof(val));
如果您使用 GUI 工具包直接操作窗口句柄(例如 MFC),请记住 HWND 和其他内部指针在 32 位系统上运行时使用较小的大小(或模拟 sysWoW - Windows 上的 Windows)
注意#ifdef _WIN64 宏点
内联汇编对可移植性不利,而且内在函数通常是特定于平台的
32 位应用程序当然只链接到 32 位库,检查依赖关系
最后,如果目标环境是 x86_64,请记住,在 Windows 上,32 位应用程序在文件系统和注册表写入方面的虚拟化方式可能有所不同(它们有专用的子位置)。
祝你好运。
【解决方案2】:
一般来说,使用“太大”的指针存储本身不应该是一个问题。这就像拥有一个 18 位计算器并且只使用 9 位数字 - 没有什么不好的结果 [而且我确信您的 64 位代码不会“溢出”它们的 64 位值,即使在较低的 48 位中也是如此,因为这在 x86-64 架构中是不允许的(代码必须区分高地址和低地址,并确保维护低 48 位的符号扩展 - 如果不这样做,处理器将抛出异常)]。
当然,为了节省空间,您可能应该使用intptr_t 或uintptr_t 而不是INT64,但除了空间之外,使用INT64 来存储和操作指针应该没有问题一个 32 位系统 [我已经编写了完全可以做到这一点的代码,因为代码本身并不“知道”底层的位数]
我怀疑您的问题来自某种无效的计算,但如果不实际检查代码,则真的无法说出究竟是什么问题。
堆错误听起来像是堆损坏(写入超出存储末尾) - 一种猜测是代码假设INT64 和指针大小相同。可能很难说,但是如果您可以将错误作为断点捕获,那么您可能可以回顾堆栈以查看数据的来源并尝试确定实际发生的情况。
虽然我在第一段中说它通常有效,但我还要说使用任何形式的将指针转换为整数、进行数学运算、将整数转换回指针都是一件坏事。不是因为它在技术上不起作用,而是因为它很难维护,并且通常有其他方法可以通过适当定义相关数据结构来实现这一点。正如“代码气味”类型所说的那样,“闻起来很糟糕”。