リンカ・ローダと実行形式
C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。
- ACPUがコンストラクタを見つけて、自動で先に実行する
- Bmain関数の最初の行に、コンパイラが必ずすべてのコンストラクタを書き写す
- Cコンストラクタを呼ぶ関数の番地が.init_arrayなどの表にまとめられ、起動コードがmainの前に順に呼ぶ
答えと解説を見る
正解:C. コンストラクタを呼ぶ関数の番地が.init_arrayなどの表にまとめられ、起動コードがmainの前に順に呼ぶ
コンパイラは、各ファイルのグローバルなオブジェクトを初期化する関数を作り、その番地を.init_arrayという特別なセクションに入れます。リンカはすべてのファイルの.init_arrayを1つの表にまとめ、起動コードや動的リンカがmainの前にこの表の関数を順に呼びます。逆に終了時の処理は.fini_arrayにまとめられます。ファイルをまたぐ初期化の順番は決まっていないので、依存させないよう注意が必要です。
- A. CPUはコンストラクタという概念を知りません。
- B. ほかのファイルのオブジェクトは、mainのファイルからは分かりません。
- C. 正しい。リンカが各ファイルの表を1つにまとめます。