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

Patricia Arquette
リリース: 2024-11-03 06:22:02
オリジナル
435 人が閲覧しました

Can Large Arrays Be Declared on the Stack in C  ?

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

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

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

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

double *n = new double[4200000];
ログイン後にコピー
ログイン後にコピー

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

double n[500];
ログイン後にコピー

パフォーマンスを向上させるために、ベクトルを使用できます:

std::vector<int> someElements(4200000);
someElements[234];
ログイン後にコピー

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

動的にメモリを割り当てる別の方法を使用します:

double *n = new double[4200000];
ログイン後にコピー
ログイン後にコピー

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

delete[] n;
ログイン後にコピー

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

以上がC のスタック上で大きな配列を宣言できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート