最大矢量大小过早达到

时间:2013-04-20 17:03:52

标签: c++ stdvector

我正在测试我在计算机上制作一维矢量的大小。为此,我使用以下MWE:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<double> vec;

    const unsigned long long lim = 1E8;
    for(unsigned long long i=0; i<lim; i++)
    {
        vec.push_back(i);
    }
    cout << vec.max_size() << endl; //outputs 536.870.911 on my 32-bit system


    return 0;
}

如图所示,max_size()告诉我std::vector可以在我的系统中包含536.870.911个元素。但是,当我运行上面的MWE时,我得到了错误

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

我的电脑有2GB RAM,但1E8整数只占381MB,所以我不明白为什么会出现bad_alloc错误?

1 个答案:

答案 0 :(得分:12)

1E8 = 100000000sizeof(double) = 8 [几乎在所有系统中],所以762MB。现在,如果我们从一个16个元素的向量开始,并且每次“超出”当前大小时它会加倍,为1E8元素获取空间,我们得到以下序列:

16,32,64,128,256,... 67108864(64M条目),下一个是134217728,占用8 * 128M = 1GB,你还需要有64M * 8 = 512MB的空间chunk同时复制旧数据。鉴于在32位进程中没有可用的2GB空间,因为某些内存用于堆栈,程序代码,DLL和其他类似的东西,找到1GB连续的空间区域可能很难是(超过)已经占用了512MB。

“我不能像我想象的那样适应”这个问题并不是一个不寻常的问题。

一种解决方案是使用std::vector::reserve()预分配足够的空间。这更有可能工作,因为你只需要一个大的分配,而不是两个 - 并且它也不需要比762MB多得多,因为它被分配到正确的大小,而不是一些任意的“目前的两倍” ”。