Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使应用程序能够识别大地址?_C++_Visual Studio_Winapi - Fatal编程技术网

C++ 如何使应用程序能够识别大地址?

C++ 如何使应用程序能够识别大地址?,c++,visual-studio,winapi,C++,Visual Studio,Winapi,我目前正在使我们的应用程序能够识别大地址。经验表明,在这样做时会出现一些意想不到的问题。我写这篇文章是为了列出需要采取的步骤 中列出的开发注意事项提供了一个良好的起点,但并不完整: 以下注意事项将有助于确保代码能够处理大于2GB的地址: 避免使用有符号指针算法(即比较和相加) 指针使用所有32位。不要将Bit31用于其他内容 一些dll将在2GB边界下加载。在这种情况下,无法使用VirtualAlloc()分配连续内存 尽可能使用GlobalMemoryStatusEx()(首选)或Globa

我目前正在使我们的应用程序能够识别大地址。经验表明,在这样做时会出现一些意想不到的问题。我写这篇文章是为了列出需要采取的步骤

中列出的开发注意事项提供了一个良好的起点,但并不完整:

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

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

因此,问题是:<强>当C++ C++ Win32本地应用程序大地址知晓时,需要完成的事情清单是什么?<强> < /P> < UL>

  • (明显)在项目属性:Linker/System/Enable larg Address中选择大于2 GB(/largeAddressware)的支持地址
  • 检查所有指针减法,并验证结果是否存储在可以包含可能差异的类型中,或者用比较或其他构造替换它们-请参阅)。注意:指针比较应该很好,与AMD的建议相反,没有理由认为它会导致4GB问题
  • 确保您没有假设指针的位31为零,不要尝试将位31用于其他内容
  • 用GetCursorInfo替换所有GetCursorPos调用-请参阅
  • 对于PVOID64中的所有分配,请使用PtrToPtr64(如使用ReadFileScatter时需要),请参阅

  • “消除所有指针减法”过多。单个数组中的指针工作得非常好。@Suma:指针添加不好,因为设置了
    LargeAddressware
    时,指针添加可能会溢出。此外:请注意此处讨论的第三方库:需要此链接器选项,/LargeAddressware只设置一次,用于链接应用程序EXE,或者也必须将其设置为链接组件DLL?@DavidM.Miller该标志似乎对DLL-没有影响。只需确保与exe一起使用的DLL确实能够处理较大的地址。