gpt4 book ai didi

c++ - 为 vector 的 vector 分配内存

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:42 25 4
gpt4 key购买 nike

我试图为 vector 的 vector 保留空间,但它不起作用并抛出以下错误:

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

每次我都使用足够大的数字。我所拥有的最小版本如下:

#include <vector>
#include <iostream>
using namespace std;


int main(){

int base;
cout << "Enter Base: ";
cin >> base;

int dimension;
cout << "Enter Dimension: ";
cin >> dimension;

int perms = 1;
for(int i=0; i<dimension; i++){
perms *= base;
} // This gets the number of permutations with repetition

int length;
cout << "Enter Length: ";
cin >> length;

float structSize = 1.0;

for(float i=0.0; i<length; i++){
structSize *= perms-i;
structSize /= (i+1.0);
} // This gets the number of combinations

vector< vector< vector<double> > > allStructs;
allStructs.reserve(structSize);

return 0;
}

它应该适用于大型 structSize,但在 base=3、dimension=4、length=6 时失败,这使得 structSize=324,540,216。这有可能奏效吗?

最佳答案

您需要考虑您的内存使用情况。

It should work for large structSizes, but fails at base=3, dimension=4, length=6 which makes structSize=324,540,216. Is it possible for this to work?

因此,在抽象层面上,您正在做的是分配一个包含 324,540,216 的数据结构。 vector<vector<double>> 的实例对象。

这是我们对 vector 的了解对象:

  • 其大小必须至少为 16 个字节;它需要存储一个指针,在 64 位架构中,它可能是 8 个字节,它需要存储一个大小,也可能是 8 个字节。
  • 它的大小可能会大得多,因为从你实例化最后一个 vector<double> 的那一刻起对象,它会在您每次创建一个对象时再消耗 [at-least-] 16 个字节。

所以从表面上看,您的 allStructs.reserve(structSize)调用正在分配 5 GB。它分配的可能不止于此,因为 vector 元数据的大小很可能大于 16 字节。

关于c++ - 为 vector 的 vector 分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com