【C++】関数スコープ静的変数の初期化のタイミング

いや〜奥が深い。

 

コンストラクタなしだと、main()より前に初期化される。

https://wandbox.org/permlink/oTDnnjBwE2cs0OYJ

しかし、コンストラクタを書くと、0で初期化されている。
関数を呼び出したあと、初期値で初期化されている。

https://wandbox.org/permlink/7VNXUFiQ5iRKATjc

上記は gcc での実験結果。

clang ではどうなるか、試してみた。

まず、コンストラクタなし。mainより前に初期化。

https://wandbox.org/permlink/9nkMD1iNGQjX2xMx

次にコンストラクタあり。やはり、mainより前は 0 クリアされており、
foo()で初期値で初期化されている。

https://wandbox.org/permlink/hWzk7sS2DIyG9iK9

static X x = {0xcafe, 0xbabe};

static X x{0xcafe, 0xbabe};

の結果は同じだった。(あたりまえ) 

https://wandbox.org/permlink/uQsN8hAOvpmAjyR9

 

もしかしたらコンストラクタ初期化子の部分だけはmain()関数より前に初期化されたりしないか?と思って試した。

https://wandbox.org/permlink/siR1Wp6Txc0n8z2M

new だとダメだった。

コンパイル時にアドレスが決まっている場合で試してみた。

https://wandbox.org/permlink/AreXSt1Xn9v2bRMj

やはり、初期化子リストは foo()まで実行されなかった。