【问题标题】:What to do to make application Large Address Aware?如何使应用程序具有大地址感知能力?
【发布时间】:2011-03-07 18:37:57
【问题描述】:

我目前正在制作我们的应用程序大地址感知。经验表明,这样做时会遇到一些意想不到的问题。我创建这篇文章是为了列出需要采取的步骤。

AMD Large Address Aware guide 中列出的开发注意事项提供了一个很好的起点,但绝不是完整的:

以下注意事项将有助于确保代码可以处理大于 2GB 的地址:

  • 避免使用有符号指针算术(即比较和相加)
  • 指针使用全部 32 位。不要将 Bit31 用于其他用途。
  • 某些 dll 将在 2GB 边界下加载。在这种情况下,无法使用 VirtualAlloc() 分配连续的内存。
  • 尽可能使用 GlobalMemoryStatusEx()(首选)或 GlobalMemoryStatus() 来检索内存大小。

因此,问题是:在制作 C++ Win32 本机应用程序大地址感知时需要做的事情的完整列表是什么?

【问题讨论】:

    标签: c++ visual-studio winapi


    【解决方案1】:
    • (很明显)在项目属性中选择支持地址大于2 GB(/LARGEADDRESSAWARE):链接器/系统/启用大地址
    • 检查所有指针减法并验证结果是否存储在可以包含可能差异的类型中,或者用比较或其他构造替换它们 - 请参阅Detect pointer arithmetics because of LARGEADDRESSAWARE)。注意:指针比较应该没问题,与 AMD 的建议相反,它没有理由导致 4 GB 问题
    • 确保您没有假设指针的 Bit31 为零,不要尝试将 Bit31 用于其他用途。
    • 用 GetCursorInfo 替换所有 GetCursorPos 调用 - 请参阅 GetCursorPos fails with large addresses
    • 对于 PVOID64 中的所有分配,使用 PtrToPtr64,例如需要使用 ReadFileScatter 时,请参阅 ReadFileScatter remark section

    【讨论】:

    • “消除所有指针减法”是多余的。单个数组中的指针工作得很好。
    • @Suma:添加指针不好,因为当设置LARGEADDRESSAWARE 时,指针添加可能会溢出。
    • 另外:注意此处讨论的第 3 方库:stackoverflow.com/questions/2288728
    • 需要这个链接器选项,/LARGEADDRESSAWARE 只设置一次,用于链接应用程序 EXE,还是必须同时设置用于链接组件 DLL?
    • @DavidM.Miller 似乎该标志对 DLL 没有影响 - stackoverflow.com/questions/2927598/… 。只需确保与 exe 一起使用的 DLL 确实可以处理大地址。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多