if
はい、通常、内部ブールフラグを持つ暗黙のステートメントに変換されます。したがって、最も基本的な実装では、宣言は通常、次のようなものに変換されます
void go( int x ) {
static int j;
static bool j_initialized;
if (!j_initialized) {
j = x;
j_initialized = true;
}
...
}
その上、静的オブジェクトに自明ではないデストラクタがある場合、言語は別の規則に従う必要があります。そのような静的オブジェクトは、構築の逆の順序で破棄する必要があります。構築順序は実行時にしか分からないため、破棄順序も実行時に定義されます。したがって、重要なデストラクタを使用してローカルの静的オブジェクトを構築するたびに、プログラムはそれをある種の線形コンテナに登録する必要があります。これは、後でこれらのオブジェクトを適切な順序で破棄するために使用されます。
言うまでもなく、実際の詳細は実装に依存します。
コンパイル時の定数で初期化された「プリミティブ」タイプの静的オブジェクト(int
例のように)に関しては、コンパイラは起動時にそのオブジェクトを自由に初期化できることを追加する価値があります。違いに気付くことはありません。ただし、「非プリミティブ」オブジェクトを使用したより複雑な例を挙げると、
void go( int x ) {
static std::string s = "Hello World!";
...
上記のアプローチif
は、オブジェクトがコンパイル時の定数で初期化されている場合でも、生成されたコードで見つかると予想されるものです。
あなたの場合、初期化子はコンパイル時に不明です。つまり、コンパイラは初期化を遅らせ、その暗黙的なを使用する必要がありますif
。