1

我正在测试我可以在我的计算机上制作多大的一维矢量。为此,我使用以下 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 内存,但 1E8 整数只占用 381MB,所以我不明白为什么会bad_alloc出错?

4

1 回答 1

12

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

16, 32, 64, 128, 256, ... 67108864(64M 条目),下一个是 134217728,占用 8 * 128M = 1GB,并且您还必须有空间容纳 64M * 8 = 512MB 的块同时,从中复制旧数据。鉴于在 32 位进程中没有完整的 2GB 可用空间,因为一些内存已用于堆栈、程序代码、DLL 和其他类似的东西,因此找到一个 1GB 的连续空间区域可能会很困难。已占用(超过)512MB。

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

一种解决方案是使用std::vector::reserve()预先分配足够的空间。这更有可能奏效,因为您只需要一个大分配,而不是两个 - 而且它也不需要超过 762MB,因为它被分配到正确的大小,而不是一些任意的“两倍于当前是”。

于 2013-04-20T17:21:36.037 回答