【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()まで実行されなかった。