你应该分配多少内存?

Bil*_*ill 8 c++ new-operator dynamic-memory-allocation

背景:我正在编写一个使用大量地理数据的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;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够分配内存,直到应用程序达到32位寻址的4千兆字节限制.但是,当nBandBytes为466,560,000时,第二次尝试新抛出std :: bad_alloc.在这个阶段,进程的工作集(内存)值是665,232 K所以,我似乎无法获得分配的内存.

对于32位Windows中的应用程序,已经提到了2 gig的限制,对于win32,可以使用/ 3GB开关扩展到3 gig.在这种环境下这是一个很好的建议,但与这种情况无关.

在具有32位应用程序的64位操作系统下,您应该分配多少内存?

jal*_*alf 11

操作系统想要给你一样多.默认情况下,Windows允许32位进程具有2GB的地址空间.这被分成几个块.为堆栈预留一个区域,为每个可执行文件和加载的dll分配一个区域.无论剩下什么都可以动态分配,但不能保证它将是一个大的连续块.它可能是几个较小的块,每块几百MB.

如果使用LargeAddressAware标志进行编译,64位Windows将允许您使用完整的4GB地址空间,这应该有所帮助,但一般来说,

  • 你不应该假设可用的内存是连续的.您应该能够使用多个较小的分配而不是几个较大的分配
  • 如果需要大量内存,则应将其编译为64位应用程序.


Ahm*_*aid 6

在Windows 32位上,正常进程最多可以占用2 GB,但是使用/ 3GB开关它可以达到3 GB(对于Windows 2003).

但在你的情况下,我认为你正在分配连续的内存,所以发生了异常.

  • +1 - 从未考虑过分配连续数组只能为您提供最大量的"连续"内存!真的很好点. (3认同)