有没有办法在C ++中执行此操作而不会在运行时崩溃?
现在我宣布
vector<vector<int> > myvec(veclength);
我怎样才能将veclength提升到最高(正确)?即使在10 ^ 7时,当我应该有足够的计算机内存时,它也会崩溃。
答案 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类而遇到限制。键盘链接已经留下以便于参考,但在本地环境中进行测试时,我得到了相同的数字。