続 PODと集成体の静的初期化
昨日の調査の続きです。
関連する項目を読んでみて文脈から推測するに、最初の考え方で合っていたようです。
- 6.7/4は静的記憶域期間(static storage duration)をもつ局所(local)オブジェクトについての記述
- 6.7/4の「定数式による初期化」とは定数式のみをメンバとする初期化子並び({〜})を使ったものも含む
- 8.5.1/14は静的記憶域期間をもつ非局所(non-local)オブジェクトについての記述
この結果、昨日の例はともに静的初期化「してもよい」となります。
struct hoge { int n; }; void func() { static int a = 1; // 静的初期化でも動的初期化でもよい static hoge b = { 2 }; // 静的初期化でも動的初期化でもよい }
処理系の実装としては、
- 静的に初期化する
- マルチスレッドを考慮した動的初期化を行う(pthread_once等を使う)
- マルチスレッドを考慮せずに動的初期化を行う
が考えられるので、静的記憶域期間をもつ局所オブジェクトを使う場合はどのようなコードが出力されるか念のため確認しておいたほうがよいでしょう。
(21:00 追記)
staticデータメンバなら静的初期化を強制できるので、そちらを使ったほうがポータブルです。