2017-12-04 18 views
0

3次元と2次元のサイズがarray[40000][40000]以上の大規模な計算プログラムを実行したいのですが、このコードは私の問題を少し説明することができます。コンパイルのメモリを増やす方法、またはプログラムの実行時にコンパイラのメモリを増やす方法(削除する) vectorように、コンテンツの動的割り当てを使用する(したがって、スタックがオーバーフローしない)配列の最大サイズは2次元C++で

#include<iostream> 
#include<cstdlib> 
#include<vector> 
using namespace std; 
int main(){ 
    float array[40000][40000]; 
    //vector< vector<double> > array(1000,1000);  
    cout<<"bingo"<<endl; 
    return 0; 
} 
+3

通常、配列を含むローカル変数がスタックに配置されます。スタックは限られたリソースですが、Visual Studioコンパイラを使用するWindowsでは、デフォルトのスタックサイズは1メガバイトです。あなたの配列(4バイトの 'float'を仮定)はほぼ6 ** GIGA **バイト(40000 * 40000 * 4)です。解決策はベクトルを使用することです、なぜあなたはそれをコメントアウトしましたか?おそらくあなたが必要とするのは[良いstd :: vector'リファレンス](http://en.cppreference.com/w/cpp/container/vector)ですか?特に[そのコンストラクタ](http://en.cppreference.com/w/cpp/container/vector/vector)について?十分なメモリがあると仮定します。 –

+3

あなたはあなたの問題(他の大きすぎる配列)を説明することができますか? –

+1

「同じ問題があるので」いいえ、別の**問題です。 –

答えて

2

A vectorよりわずかに良いオプション(ベクトルのベクトル未満、はるかに良い)が、リサイズ招待されていません。

std::unique_ptr<float[][40000]> array{ new float[40000][40000] }; 

便利な、float[40000][40000]はまだでも、不完全な配列型に慣れていないプログラマにここで何が起こっているか、それはかなり明白なって、表示されます。


vector<vector<T> >それはすべてが個別に初期化されなければならない多くの異なる割り当てを有することになるので、非常に悪い、得られたストレージは不連続であろう。 vector<T>vector<T*>の組み合わせが若干優れています。後者は、1行分離れた場所に作成されたポインタを、前者が管理する1つの大きなバッファに格納します。

+0

それは 'auto big_array = std :: make_unique (40000);' even [better](https://stackoverflow.com/a/22571331/4944425)ではありませんか? –

+0

@Bob__: 'make_unique'は、1つの完全式に複数の割り当てがある場合に利点があります。この例では 'make_unique'には利点がありません。そして、私は構文がOPのスキルレベルの読者にはあまり明確でないと考えます。 –