声明一个非常大的整数向量?

时间:2012-04-22 12:27:07

标签: c++ vector

有没有办法在C ++中执行此操作而不会在运行时崩溃?

现在我宣布

vector<vector<int> > myvec(veclength);

我怎样才能将veclength提升到最高(正确)?即使在10 ^ 7时,当我应该有足够的计算机内存时,它也会崩溃。

2 个答案:

答案 0 :(得分:2)

这需要花费大约250 MiB的空间 1 (或更少,取决于架构)所以内存肯定不是问题,max_size也不应该是大约10 17 (≈ 2 64 / 8 + 8 + 8 )。

我应该提一下,通过查看GCC'libstdc ++和LLVM的libc ++中std::vector的实现,以及在实时系统上进行测试,我证实了这些计算。计算值与实际实现相对应1:1,OP的代码与veclength = 10e7完美配合。

因此,我得出结论,真正的原因是在其他地方。


1)通过用三个64位整数近似每个单独向量的大小来计算,分别表示开始指针,大小和容量,并假设空向量的默认容量为0。实现可能有所不同,但可能并不多。

答案 1 :(得分:-2)

根据我上面的评论,我想我可能会为您提供解决方案。

  

参见max_size并测试一下   max_size在你的机器上。这里的关键是矢量大小   限制是reduced as the size of vector elements increase - 从那以后   你有一个int矢量向量,外向量的大小是   可能非常有限。

以下是一个人通过运行上述程序获得的结果。请注意,int(大小为4)的向量最大大小为1073741823, 10 ^ 9 您使用向量&gt;这将占用显着更多空间,从而显着减小最大尺寸。

Max elements that can be inserted into a vector having elements of size '1' is: 4294967295
Max elements that can be inserted into a vector having elements of size '4' is: 1073741823
Max elements that can be inserted into a vector having elements of size '8' is: 536870911
Max elements that can be inserted into a vector having elements of size '4' is: 1073741823

如果您将数据结构更改为vector vector<int>个指针,则可以存储更多数据。我知道这可能从根本上改变了很多相应的功能和结构,但这是vector的限制。


可能涉及的人:http://codepad.org/nAoPi7cV

int main()
{
   std::cout << "Max elements that can be inserted into a vector having elements of size '" 
             << sizeof( std::vector<int> ) << "' is: "
             << std::vector<std::vector<int> >().max_size() << std::endl;
}   
  

可以插入到具有大小为“4”的元素的向量中的最大元素是:1073741823

     

可以插入到具有大小为“28”的元素的向量中的最大元素是:153391689

log(153391689)〜= 8.2

所以它的max_size大到足以在键盘编译器上保持10 ^ 7。在较小的机器上,它可能不是。


另请注意,即使给出了这个最大大小,程序也会出现段落错误:http://codepad.org/agKMMEjQ

int main()
{
   std::vector<std::vector<int> > myvec(153391689);
}
  

分段错误


如果你进一步减少到提问者提议的大小(10 ^ 7),程序会再次崩溃:http://codepad.org/zMG0VCeg

std::vector<std::vector<int> > myvec(10000000);
  

std :: bad_alloc:St9bad_alloc

     

中止。


如果您进一步减少尝试的尺寸,程序运行愉快:http://codepad.org/sbMPppgx

std::vector<std::vector<int> > myvec(100000);

std::cout << myvec.size();
  

100000


上述程序非常简单,遇到了提问者指定的确切问题 - 因此问题不在于其他地方 - 由于std :: vector类而遇到限制。键盘链接已经留下以便于参考,但在本地环境中进行测试时,我得到了相同的数字。