首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制堆分配超过4GB

强制堆分配超过4GB
EN

Stack Overflow用户
提问于 2019-11-20 16:09:55
回答 1查看 263关注 0票数 5

同事将32位C++应用程序转换为64位。出于测试目的,现在的想法是指示堆管理器只返回64位范围内的地址。

在因特网上搜索解决方案似乎不能带来非常可靠的结果:

  • MSDN论坛建议在CRT初始化之前使用VirtualAlloc()。但是,我不明白为什么它不应该返回一个指向高地址的指针,剩下的4GB是空的。
  • 雷蒙德·陈说,Allocation­Preference可以设置为MEM_TOP_DOWN。然而,这适用于整个系统,因此需要重新启动,这是不方便的。(还描述了论MSDN)。

我深入研究了应用程序验证器,并在堆条目的属性中发现了一些有趣的选项:

如您所见,我修改了SizeStart和SizeEnd,以及AddrStart和AddrEnd。

不幸的是,

  1. 这些文本框不接受64位地址。
  2. 这些设置似乎没有效果。

虽然地址高于输入的值,但堆的大小没有改变:

代码语言:javascript
复制
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      
-------------------------------------------------------------------------------------

这些应用程序验证器设置仍然有效吗?如何成功地应用它们?

EN

回答 1

Stack Overflow用户

发布于 2021-11-23 06:39:19

正如评论中提到的@HansPassant,Windows 8的分配超过了4GB的限制。这是因为在默认情况下,64位应用程序是使用/HIGHENTROPYVA标志编译的,正如陈雷蒙德的“新事物”博文中提到的那样。

对于Windows7,想法是使用VirtualQuery(),检查MEM_FREE,然后用VirtualAlloc()分配所有这些区域,在那里您可以传递要分配的地址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58958744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档