コンパイラ

関数のインライン展開の利点と欠点の組み合わせとして正しいものはどれか。

  1. A利点はコードが小さくなること、欠点は呼び出しの手間が増えること
  2. B利点はコンパイルが速く終わること、欠点は実行の結果が変わってしまうこと
  3. C利点は呼び出しの手間が消えること、欠点はコードが大きくなること
答えと解説を見る

正解:C. 利点は呼び出しの手間が消えること、欠点はコードが大きくなること

インライン展開では呼び出しの代わりに関数の本体を埋め込むので、引数の受け渡し、分岐、戻りの手間がなくなります。さらに、呼び出し元の定数などが本体に伝わり、定数畳み込みや不要コードの削除が効くようになるのが大きな利点です。一方、呼び出すたびに本体の写しができるのでコードが大きくなり、命令キャッシュのミスが増えることもあるため、小さな関数やよく呼ばれる関数を選んで行います。正しく行えば実行結果は変わりません。

  • A. コードはむしろ大きくなり、呼び出しの手間は減ります。
  • B. 正しく行えば実行結果は変わりません。
  • C. 正しい。呼び出しの手間が消え最適化が広がる反面、コードが大きくなります。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. ループ展開(ループアンローリング)の主な効果として正しいものはどれか。
  2. 上のループで、ループ不変式の移動(ループの外への移動)の対象になる計算はどれか。(x、yはループ内で変更されないものとする)
  3. 上のループで、添字の計算 i * 4 に強度低減を行ったときの変換として正しいものはどれか。
  4. 上のループを、SIMD命令を使ってベクトル化しにくい主な理由はどれか。
  5. 上の関数で、コンパイラが *b の読み込みをループの外に出す最適化を、そのままでは行えない理由はどれか。