C++でベクトルをグローバル変数として宣言する 質問する

C++でベクトルをグローバル変数として宣言する 質問する

C++ でベクトルをグローバルとして宣言するのは良い方法でしょうか?

私がやったことはこれです。

#include <vector>
std::vector<int> vec;

私のプログラムは正常にコンパイルされますが、特定の状況下ではランタイム エラーが発生するかどうかはわかりません。私の理解では、グローバル変数のメモリはコンパイル時に割り当てられ、コンパイラはこのベクトルを拡張できる限られた量のメモリを予約する場合があります。この制限に達すると、書き込まれている内容が別の変数が使用するメモリを消費する可能性があります。

お知らせ下さい。

ベストアンサー1

プログラムは正常にコンパイルされますが、特定の状況下でランタイム エラーが発生するかどうかはわかりません。

これは安全に実行できます。変数のストレージはvec静的に割り当てられ、そのデフォルト コンストラクターはいずれかの時点で呼び出されます (翻訳単位間の初期化の順序は厳密に定義されていないため、プログラム全体のコンテキスト内での正確なタイミングは厳密に定義されていません)。

コンパイラは、このベクトルを拡張できるメモリの量を制限して予約する場合があります。この制限に達すると、書き込まれる内容が別の変数によって使用されるメモリを消費する可能性があります。

ベクトル自体はヒープ上にストレージを割り当てるため、ベクトルをローカル変数としてインスタンス化した場合とは異なり、その拡張には制限が課せられません。基本的に、ベクトルが内部ストレージを再割り当てする必要がある時点で連続して割り当てることができるメモリの量によって制限されます。

とはいえ、これは安全に実行できるものの、必ずしも良い方法とは言えません。これは、他のすべてのグローバル変数やグローバルにアクセス可能なストレージの領域に該当し、少し議論の余地があるテーマです。一般的に、原則としてグローバル変数は避けることをお勧めします。場合によっては許容されるかもしれませんが、グローバル アクセスは、変数へのアクセスを制御し、変数とそれが制御または暗示する状態に不変条件を適用する能力に反します。アクセス パスが明確に説明されていないため、コードベースが拡張されると、システムの保守が困難になる可能性があります。

おすすめ記事