私は関数内の静的変数の基本的な実装について興味があります。静的変数の初期化はコンパイラによってどのように実装されますか?
基本型(char、int、doubleなど)の静的変数を宣言して初期値を与えると、コンパイラはその変数の値をmain()
前のプログラムが呼び出されます。
void SomeFunction();
int main(int argCount, char ** argList)
{
// at this point, the memory reserved for 'answer'
// already contains the value of 42
SomeFunction();
}
void SomeFunction()
{
static int answer = 42;
}
しかし、静的変数は、クラスのインスタンスである場合:
class MyClass
{
//...
};
void SomeFunction();
int main(int argCount, char ** argList)
{
SomeFunction();
}
void SomeFunction()
{
static MyClass myVar;
}
私はそれは関数が呼び出されるのは初めてのことまでは初期化されないであろうことを知っています。コンパイラは、関数が初めて呼び出されるときを知る方法がないので、どのようにしてこの動作が生成されますか?基本的にifブロックを関数本体に導入していますか?
static bool initialized = 0;
if (!initialized)
{
// construct myVar
initialized = 1;
}
何か変更がありましたか?私は静的の各初期化はスレッドセーフであることをC + + 11の後に聞いたことがある。 –
@VictorPolevoy:はい - この回答が書かれたとき、C++ 11は存在しませんでした。 C++ 11では標準でスレッドサポートが含まれていましたが、これはブロックスコープ静的変数(6.7/4)の初期化の説明に追加されました: "変数が初期化されている間にコントロールが同時に宣言に入ると、初期化の完了を待つ」。 –
私は答えとして受け入れられ、10票を持っているので、あなたの答えを編集することをお勧めします。また、この質問は、静的変数の初期化のトピックで最もよく見えます。 –