9

Dev C++ を使用してシミュレーション プログラムを作成しています。そのためには、データ型が の 1 次元配列を宣言する必要がありますdouble4200000のような要素が含まれていますdouble n[4200000]

コンパイラはエラーを表示しませんが、プログラムは実行時に終了します。5000チェックしたところ、プログラムは要素を持つ配列に対して問題なく実行されます。

これで、スタック上でこのような大きな配列を宣言することはお勧めできません。ただし、問題は、シミュレーションでは、配列から特定の要素を複数回呼び出す必要があることです。たとえば、特定の計算に対してn[234]またはの値が必要になる場合があります。n[46664]したがって、要素をふるいにかけるのが簡単な配列が必要です。

この配列をスタック上で宣言する方法はありますか?

4

4 に答える 4

10

いいえ、スタック上でこの配列を宣言する方法はありません (「合理的」と呼びます)。ただし、スタック上でポインターを宣言し、ヒープ上に少しのメモリを確保することはできます。

double *n = new double[4200000];

これの n[234] へのアクセスは、次のように宣言した配列の n[234] へのアクセスよりも速くはなりません。

double n[500];

またはさらに良いことに、ベクトルを使用できます

std::vector<int> someElements(4200000);
someElements[234];//Is equally fast as our n[234] from other examples, if you optimize (-O3) and the difference on small programs is negligible if you don't(+5%)

-O3 で最適化すると、配列と同じくらい高速で、はるかに安全です。と同様に

double *n = new double[4200000]; 

これを行わない限り、メモリリークが発生します。

delete[] n;

そして、例外やさまざまなことを考えると、これは非常に危険な方法です。

于 2013-06-10T17:38:59.160 に答える
8

スタックサイズを増やすことができます。次のオプションをリンク フラグに追加してみてください。

-Wl,--stack,36000000

ただし、大きすぎる可能性があります (Windows がスタック サイズに上限を設けているかどうかはわかりません)。他の回答で指摘されているように、動的メモリ割り当てを使用します。

(奇妙なことに、答えを書いて、それが受け入れられないことを願っています... :-P)

于 2013-06-10T17:56:47.697 に答える
0

これをスタック上で具体的にしたい理由はありますか?

以下は同様の方法で使用できる構造を提供するため(特に を使用して値にアクセスするarray[index])、サイズの制限がはるかに少ないためです(合計最大サイズは32ビット/ 64ビットメモリモデルと使用可能なメモリに応じて異なります) (RAM とスワップ メモリ)) ヒープから割り当てられるためです。

int arraysize= 4200000;
int *heaparray= new int[arraysize];

... 

k= heaparray[456];

...

delete [] heaparray;

return;
于 2013-06-10T17:40:02.687 に答える