我正在测试我在计算机上制作一维矢量的大小。为此,我使用以下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
错误?
答案 0 :(得分:12)
1E8 = 100000000
和sizeof(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多得多,因为它被分配到正确的大小,而不是一些任意的“目前的两倍” ”。