2013-12-13 73 views
3

我有一个带有8 Gb RAM的Windows7 Maximal 64位计算机。我已经创造了一个MSVC Win32控制台aplication并写下如下:Windows应用程序的堆大小

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?

+5

只需构建程序的x64版本。 Build +配置管理器。行动解决方案=新建,选择“x64”。 –

+1

首先你是岸上你的总有效的64位变量? (在尝试打印块数而不是总内存大小之前,我已经看到一些没有64位算法的64位变量)。在64位操作系统上的第二个32位应用程序在仿真器(WOW)上运行,因此理论上限制应为4GB(〜3GB)。 – Spektre

+0

@Spektre:仅当它们使用“大地址感知”链接器标志进行编译时,该标志是选择加入的。否则,出于兼容性原因,限制仍然是2 GB。 –

回答

3

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

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

相关问题