我正在测试我在计算机上制作一维矢量的大小.为此,我使用以下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;
}
Run Code Online (Sandbox Code Playgroud)
如图所示,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错误?
Mat*_*son 12
1E8 = 100000000和sizeof(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多得多,因为它被分配到正确的大小,而不是一些任意的"目前的两倍" ".
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |