有没有办法在 C++ 中做到这一点而不会在运行时崩溃?
现在我宣布
vector<vector<int> > myvec(veclength);
我怎样才能(正确地)将 veclength 提高到最高?即使在 10^7 时,当我应该有足够的计算机内存时它也会崩溃。
这应该占用大约 250 MiB 的空间1(或更少,取决于架构)所以内存绝对不是这里的问题,也不应该max_size
是 10 17 (≈ 2 64 ∕<sub>8 +8+8)。
我应该提到,我通过查看std::vector
GCC 的 libstdc++ 和 LLVM 的 libc++ 中的实现以及在实时系统上进行测试来证实这些计算。计算值与实际实现 1:1 对应,并且 OP 的代码与veclength = 10e7
.
因此,我得出结论,真正的原因在别处。
1)通过将每个单独向量的大小近似为三个 64 位整数来分别表示开始指针、大小和容量,并假设空向量的默认容量为 0。实际实现可能有所不同,但可能相差不大。
根据我上面的评论,我想我可能会为您提供解决方案。
查看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
如果您将数据结构更改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
日志(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 类而遇到限制。留下了键盘链接以便于参考,但在本地环境中测试时我得到了相同的数字。