如何使应用程序大地址感知?

时间:2010-06-24 11:37:48

标签: c++ visual-studio winapi

我目前正在制作我们的应用程序大地址识别。经验表明,这样做有一些意想不到的陷阱。我创建这篇文章是为了完整地列出需要采取的步骤。

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

  

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

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

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

1 个答案:

答案 0 :(得分:24)

  • (显而易见)在项目属性中选择大于2千兆字节(/ 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