静的 C++ クラス メンバーはいつ初期化されますか? 質問する

静的 C++ クラス メンバーはいつ初期化されますか? 質問する

これに対する簡単な答えはないようですが、静的クラス フィールドにいつアクセスできるかについて、安全に想定できるものはありますか?

編集: 唯一安全な仮定は、プログラムが開始する前にすべての静的変数が初期化される ( を呼び出す) ということのようですmain。つまり、他の静的初期化コードから静的変数を参照しない限り、何も心配する必要はないということですか?

ベストアンサー1

この標準では、同じ翻訳単位(通常は.cppファイル)で定義されたオブジェクトが定義順に初期化されること(宣言ではない):

3.6.2

静的記憶域期間 (basic.stc.static) を持つオブジェクトの記憶域は、他の初期化が行われる前にゼロ初期化 (dcl.init) される必要があります。ゼロ初期化と定数式による初期化はまとめて静的初期化と呼ばれ、その他のすべての初期化は動的初期化と呼ばれます。定数式 (expr.const) で初期化された静的記憶域期間を持つ POD 型 (basic.types) のオブジェクトは、動的初期化が行われる前に初期化される必要があります。同じ翻訳単位内の名前空間スコープで定義され、動的に初期化される静的記憶域期間を持つオブジェクトは、翻訳単位内での定義の順序で初期化される必要があります。

他に保証されていることは、翻訳単位の静的オブジェクトの初期化は、この翻訳単位のオブジェクトまたは関数を使用する前に実行されることです。

名前空間スコープのオブジェクトの動的初期化 (dcl.init、class.static、class.ctor、class.expl.init) が main の最初のステートメントの前に実行されるかどうかは、実装定義です。初期化が main の最初のステートメントの後のある時点まで延期される場合、初期化されるオブジェクトと同じ翻訳単位で定義されている関数またはオブジェクトが最初に使用される前に初期化が行われる必要があります。

それ以外は保証されません (特に、異なる翻訳単位で定義されたオブジェクトの初期化の順序は実装によって定義されます)。

おすすめ記事