「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ のスタック上で大きな配列を宣言できますか?

C++ のスタック上で大きな配列を宣言できますか?

2024 年 11 月 11 日に公開
ブラウズ:307

Can Large Arrays Be Declared on the Stack in C  ?

スタック上で大規模な配列を宣言する: 実現可能ですか?

Dev C 内で 4200000 double などの巨大なサイズの配列を宣言しようとすると、ユーザーは予期せぬ問題に遭遇する。コンパイラはエラーにフラグを立てない場合がありますが、プログラムは実行時に突然終了します。さらに、この苦境はかなりのサイズの配列でのみ発生しますが、より小さい次元の配列は完璧に機能します。

このような大きな配列をスタックに割り当てることには固有の欠点があるにもかかわらず、シミュレーション特有の要求により、要素に直接アクセスする必要があります。効率的な計算のために。これは問題を引き起こします。前述のハードルを回避する方法で、この配列をスタック上で宣言できるでしょうか?

残念ながら、答えはノーです。スタック上の配列を宣言することは実行可能なオプションではありませんが、スタックとヒープの両方の要素を組み合わせる解決策が存在します。

double *n = new double[4200000];

Byこのアプローチを使用すると、ポインタ n がスタック上で宣言され、配列のメモリがヒープ上に割り当てられます。その後、このメソッドを使用した n[234] へのアクセスは、次のように宣言された配列内の n[234] へのアクセスと区別できなくなります。

double n[500];

パフォーマンスを向上させるために、ベクトルを採用:

std::vector someElements(4200000);
someElements[234];

さらに、-O3 で最適化すると、ベクトルはより安全で同等に効率的になります。

動的にメモリを割り当てる別の方法を使用すると、次のようになります。

double *n = new double[4200000];

メモリの割り当てを解除することが重要です明示的に:

delete[] n;

これを行わないと、メモリ リークが発生し、不安定になる可能性があります。したがって、特に例外やその他の複雑さを処理する場合、この手法は本質的に安全ではありません。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3