背景:我正在写一个C++程序,处理大量的地理数据,并希望加载大块进行一次处理。我受限于使用为32位机器编译的应用程序。我正在测试的机器运行的是64位操作系统(Windows 7),并具有6个RAM。使用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时,新的第二次尝试会抛出std :: bad_alloc。在这个阶段,进程的工作集(内存)值是665,232 K因此,我似乎无法获得分配的内存。
已经有一个2演出限制在32位Windows应用程序,其可以扩展到3演出和/ 3GB开关为Win32一些提。这是在这种环境下的好建议,但与这种情况无关。
多少内存你应该能够在64位操作系统下的分配与32位应用程序?
我在网上发现了这个参考资料:“如果你在64位操作系统上作为32位应用运行,那么你可以获得所有的4G地址空间,所有这些都可以由物理内存支持(如果你有RAM),即使没有你自己使用64位指针。“从博客:http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version。aspx – Bill 2009-06-23 18:10:11
在我的32位机器上,我可以在简单测试中分配466,560,000×3个字节。似乎是在你的情况下分配点处已经分散的进程内存。 – 2009-06-23 18:19:21
我很难选择一个答案来标记正确的这个问题。我相信答案很复杂,取决于很多因素。内存映射文件是一个很好的答案,但这个问题的根本原因似乎是内存碎片。 bke1指出了用于查看内存的好工具,许多人谈论内存碎片,但我选择了第一个明确指出问题并给出了严格限制的答案(64位下的4 GB和右侧标记)。 – Bill 2009-06-23 19:16:50