【问题标题】:Heap size for windows appWindows 应用程序的堆大小
【发布时间】:2013-12-13 10:30:56
【问题描述】:

我有一台具有 8 Gb RAM 的 Windows7 最大 64 位计算机。我在 MSVC 中创建了一个 Win32 控制台应用程序,并写如下:

size_t const s_chunkSize = 1024 * 32;
size_t total = 0;
for (;;)
{
    if (!::malloc(s_chunkSize))
    {
        break;
    }
    total += s_chunkSize;
}
printf("total = %li", total);
// yes, I do not free allocated memory for simplicity

它输出 2111668224 低于 2Gb。如何强制我的程序分配超过 2Gb 的空间?我是否必须更改某些 MSVC 项目设置?还是我必须使用不是malloc 而是特定于Windows 的功能?还是我必须以某种方式配置 Windows?

【问题讨论】:

  • 只编译x64版本的程序。构建 + 配置管理器。操作解决方案 = 新建,选择“x64”。
  • 首先你支持你的总数是有效的64位变量吗? (在尝试打印块数而不是总内存大小之前,我已经看到了一些没有 64 位算术的 64 位变量)。 64 位操作系统上的第二个 32 位应用程序在模拟器 (WOW) 上运行,因此理论上限制应该是 4GB (~3GB)。
  • @Spektre:仅当它们使用“大地址感知”链接器标志编译时,该标志是可选的。否则,出于兼容性原因,限制仍为 2 GB。
  • 您的打印语句将仅打印 total 的低 32 位。应该是%Iu
  • @Matteo Italia 获取信息...我不是 MSVC++ 用户...更喜欢 Borland/Embarcadero IDE/编译器

标签: c++ windows visual-c++ malloc


【解决方案1】:

正如 cmets 中所解释的,您必须使用 /LARGEADDRESSAWARE 链接器标志来启用在提供它的机器上使用 >2GB 的虚拟地址空间(通常是带有 /3GB 标志的 32 位机器或 64 位机器)。请注意,这样做需要您在处理指针(http://blogs.msdn.com/b/oldnewthing/archive/2004/08/12/213468.aspx 和从那里链接的文章)时格外小心,并且无论如何都不允许您访问超过 4 GB 的虚拟地址空间。

更好的解决方案是构建 64 位版本的程序:您不再局限于 32 位地址空间,并且避免了设置高位地址的警告。显然,缺点(除了可能出现的移植问题)是生成的可执行文件只能在 64 位机器上运行。

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多