我有一台带有8 Gb RAM的Windows7 Maximal 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
它输出的me 2111668224低于2Gb。如何强制我的程序分配超过2Gb的内存?我必须更改一些MSVC项目设置吗?或者我必须使用的不是malloc
,而是Windows特定的功能?还是我必须以某种方式配置Windows?
如注释中所述,必须使用/LARGEADDRESSAWARE链接器标志才能在提供该标志的机器(通常是带有/3GB标志的32位机器或64位机器)上使用>2GB的虚拟地址空间。请注意,这样做需要您在处理指针时格外小心(http://blogs.msdn.com/b/oldnewthing/archive/2004/08/12/213468.aspx以及从那里链接的文章),并且无论如何都不允许您访问超过4GB的虚拟地址空间。
一个更好的解决方案是构建一个64位版本的程序:您不再局限于32位地址空间,并且可以避免使用高位集的地址的注意事项。显然,缺点(除了可能出现的移植问题)是生成的可执行文件只能在64位机器上运行。