背景:我正在编写一个处理大量地理数据的 C++ 程序,并希望一次性加载大块进行处理。我只能使用为 32 位机器编译的应用程序。我正在测试的机器运行 64 位操作系统 (Windows 7),并拥有 6 GB 内存。使用 MS VS 2008。
我有以下代码:
byte* pTempBuffer2[3];
try
{
//size_t nBufSize = nBandBytes*m_nBandCount;
pTempBuffer2[0] = new byte[nBandBytes];
pTempBuffer2[1] = new byte[nBandBytes];
pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
// If we didn't get the memory just don't buffer and we will get data one
// piece at a time.
return;
}
我希望能够分配内存,直到应用程序达到 32 位寻址的 4 GB 限制。然而,当 nBandBytes 为 466,560,000 时,new 在第二次尝试时会抛出 std::bad_alloc 。在此阶段,进程的工作集(内存)值为 665,232 K 因此,我似乎无法分配哪怕是一千兆内存。
有人提到 32 位 Windows 中的应用程序有 2 GB 的限制,可以使用 win32 的 /3GB 开关将其扩展到 3 GB。在那种环境下这是一个很好的建议,但与本例无关。
在 64 位操作系统下,您应该能够为 32 位应用程序分配多少内存?
操作系统想给你多少就给多少。默认情况下,Windows 允许 32 位进程拥有 2GB 的地址空间。这被分成几个块。一个区域用于堆栈,其他区域用于加载的每个可执行文件和 dll。剩下的任何东西都可以动态分配,但不能保证它会是一大块连续的块。它可能是几个较小的块,每个块只有几百 MB。
如果使用 LargeAddressAware 标志进行编译,64 位 Windows 将允许您使用完整的 4GB 地址空间,这应该会有所帮助,但一般来说,
- 您不应该假设可用内存是连续的。您应该能够使用多个较小的分配,而不是几个大的分配,并且
- 如果您需要大量内存,则应将其编译为 64 位应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)