6

有没有办法在 C++ 中做到这一点而不会在运行时崩溃?

现在我宣布

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

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

4

2 回答 2

4

这应该占用大约 250 MiB 的空间1(或更少,取决于架构)所以内存绝对不是这里的问题,也不应该max_size是 10 17 (≈ 2 64 ∕<sub>8 +8+8)。

我应该提到,我通过查看std::vectorGCC 的 libstdc++ 和 LLVM 的 libc++ 中的实现以及在实时系统上进行测试来证实这些计算。计算值与实际实现 1:1 对应,并且 OP 的代码与veclength = 10e7.

因此,我得出结论,真正的原因在别处。


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

于 2012-04-22T12:58:53.113 回答
-1

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

查看max_size并测试您的机器上的 max_size 是多少。这里的关键是,随着向量元素大小的增加,向量大小限制会减少- 由于您有一个 int 向量向量,因此外部向量的大小可能非常有限。

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

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

如果您将数据结构更改vectorvector<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

日志(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 类而遇到限制。留下了键盘链接以便于参考,但在本地环境中测试时我得到了相同的数字。

于 2012-04-22T12:37:51.077 回答