実行時にクラッシュすることなく 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)個々のベクトルのサイズを 3 つの 64 ビット整数で概算して、開始ポインタ、サイズ、および容量をそれぞれ示し、空のベクトルのデフォルト容量が 0 であると仮定して計算されます。実際の実装は異なる場合がありますが、おそらくそれほど大きくはありません。
上記の私のコメントに基づいて、私はあなたのための解決策があるかもしれないと思います.
max_size を参照して、マシンのmax_sizeをテストしてください。ここで重要なのは、ベクトル要素のサイズが大きくなるにつれて、ベクトル サイズの制限が小さくなることです。また、int のベクトルのベクトルがあるため、外側のベクトルのサイズはかなり制限される可能性があります。
上記のプログラムを実行して 1 人が得た結果を次に示します。int (サイズ 4) のベクトルの最大サイズは 1073741823 であることに注意してください。これは10^9です。 vector> を使用すると、より多くのスペースが必要になるため、最大サイズが大幅に縮小されます。
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 クラスが原因で制限が発生します。簡単に参照できるようにコードパッドのリンクが残されていますが、ローカル環境でテストしたときに同じ番号が得られました。