c++ - 强制堆分配超过 4 GB
问题描述
同事将 32 位 C++ 应用程序转换为 64 位。出于测试目的,现在的想法是指示堆管理器仅返回 64 位范围内的地址。
在互联网上搜索解决方案似乎并没有给出非常可靠的结果:
MSDN 论坛建议
VirtualAlloc()
在 CRT 初始化之前使用。但是,我不明白为什么不应该已经返回指向高地址的指针,而将底部的 4 GB 留空。Raymond Chen 说,Windows 7 有一个开关
AllocationPreference
,可以设置为MEM_TOP_DOWN
. 但是,这适用于整个系统,因此需要重新启动,这很不方便。(也在MSDN 上进行了描述)。
我在应用程序验证器中进行了挖掘,并在Heaps条目的属性中发现了一些有趣的选项:
如您所见,我已经修改了 SizeStart和SizeEnd以及AddrStart和AddrEnd。
很遗憾,
- 这些文本框不接受 64 位地址
- 这些设置似乎没有效果
虽然地址高于输入的值,但堆的大小没有改变:
Termination on corruption : ENABLED
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-------------------------------------------------------------------------------------
000001e0aa590000 00000002 2040 1528 2040 3 1 2 0 0
000001e0aa440000 00001002 1080 248 1080 2 2 2 0 0
000001e0aa410000 00008000 64 4 64 2 1 1 0 0
000001e0aa520000 00001002 1080 104 1080 1 2 2 0 0
000001e0af2f0000 00001002 60 60 60 6 1 1 0 0
-------------------------------------------------------------------------------------
这些应用程序验证器设置是否仍然有效?如何成功应用它们?
解决方案
正如@HansPassant 在评论中提到的那样,Windows 8 分配的内存超过了 4 GB 的限制。这是因为 64 位应用程序/HIGHENTROPYVA
默认使用标志编译,如Raymond Chen 的“旧新事物”博文中所述。
对于 Windows 7,想法是使用VirtualQuery()
、检查MEM_FREE
然后分配所有这些区域VirtualAlloc()
,您可以在其中传递要分配的地址。
推荐阅读
- python - Pycharm - 打破任何异常但忽略 StopIteration 和 ExitGenerator
- python - 将字典列表合并到单个字典中,为公共键添加值
- javascript - 如何使用 Thymeleaf blur/onblur 事件调用函数?
- servlets - 如何检测 HttpServletRequest 是否有正文?
- python - 每个句子的平均单词
- sql - 使用一个 SQL 查询从特定日期和时间范围内选择信息
- regex - Angular中模板驱动形式的正则表达式验证
- python - WTForms 2.3.0 重大更改 - ImportError: cannot import name 'HTMLString' from 'wtforms.widgets'
- delphi - 使用 RTTI 读取/写入泛型类型的属性时出错
- selenium - 可以从浏览器上的选定元素定位器访问如何交叉检查元素。不将其包含在脚本中并在硒中运行?