[c++] C ++関数の静的変数の存続期間は何ですか?


Answers

モッティは注文について正しいですが、考慮すべき他のものがいくつかあります:

コンパイラは通常、ローカル統計がすでに初期化されているかどうかを示すために隠しフラグ変数を使用し、このフラグは関数へのすべてのエントリでチェックされます。 明らかにこれは小さなパフォーマンスヒットですが、さらに懸念されるのは、このフラグがスレッドセーフであることが保証されていないことです。

上記のようなローカル静的変数があり、複数のスレッドから 'foo'が呼び出された場合、 'plonk'が不正確に、または複数回も初期化される競合状態が発生する可能性があります。 また、この場合、 'plonk'はそれを構築したスレッドとは異なるスレッドによって破壊されることがあります。

スタンダードが言っているにもかかわらず、地方の静的破壊の実際の順序には非常に注意が必要です。なぜなら、静的なものが破壊された後でもそれに頼っている可能性があるからです。

Question

変数が関数のスコープ内でstaticとして宣言されてstatic場合、変数は一度だけ初期化され、関数呼び出しの間にその値が保持されます。 その生涯はまさに何ですか? コンストラクタとデストラクタはいつ呼ばれますか?

void foo() 
{ 
    static string plonk = "When will I die?";
}

PS なぜその答えを知っていたのかという質問をした理由を知りたい人のために?




FWIW、Codegear C ++ Builderは、標準に従って予期された順序で破壊しません。

C:\> sample.exe 1 2
Created in foo
Created in if
Destroyed in foo
Destroyed in if

...それは破壊命令に頼らない別の理由です!






Related