|
インライン展開(Inline expansion または inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効果的であり、呼び出し側にそのコードを展開することで定数畳み込みなどのさらなる最適化を施せる可能性が生じる。問題点はバイナリコードが一般に肥大化する結果を招く点であり、参照の局所性を損なうほどだったり、リソースの限界を超えると性能がかえって悪化することになる。 関数型言語の世界では、インライン展開をβ変換とも呼び、関数型言語の理論的基盤となっているラムダ計算の用語としてよく使われる。 == 実装 == コンパイラがある関数をインライン展開するとしたとき、それを実施するのは一般に単純である。インライン展開は通常高レベルな中間表現(例えば抽象構文木)の段階で行われるが、言語間のクロス・インライン展開の場合は低レベルな中間表現でインライン展開を行う。いずれにしても、引数を単純に計算して、それを何らかの変数に格納し、関数の本体を呼び出し側に展開する。 インライン展開はリンク時に行うこともでき、例えばライブラリ関数などのソースが手元にない関数のインライン展開に使われる。実行時には動的プロファイリング情報を採取することでどの関数をインライン展開すべきかを決定することができる(Javaの HotSpot コンパイラなど)。 以下にC言語のソースについて「人間の手」でインライン展開を試みた例を示す: int pred(int x) ''インライン展開前:'' int f(int y) ''インライン展開後:'' int f(int y) これは単なる例である。実際のC言語ではパラメータ付きマクロやインライン関数機能を使ってコンパイラ(あるいはプリプロセッサ)にこのような変換をさせる。以下では、このコードに施せる最適化についても説明する。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「インライン展開(Inline expansion または inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効果的であり、呼び出し側にそのコードを展開することで定数畳み込みなどのさらなる最適化を施せる可能性が生じる。問題点はバイナリコードが一般に肥大化する結果を招く点であり、参照の局所性を損なうほどだったり、リソースの限界を超えると性能がかえって悪化することになる。関数型言語の世界では、インライン展開をβ変換とも呼び、関数型言語の理論的基盤となっているラムダ計算の用語としてよく使われる。== 実装 ==コンパイラがある関数をインライン展開するとしたとき、それを実施するのは一般に単純である。インライン展開は通常高レベルな中間表現(例えば抽象構文木)の段階で行われるが、言語間のクロス・インライン展開の場合は低レベルな中間表現でインライン展開を行う。いずれにしても、引数を単純に計算して、それを何らかの変数に格納し、関数の本体を呼び出し側に展開する。インライン展開はリンク時に行うこともでき、例えばライブラリ関数などのソースが手元にない関数のインライン展開に使われる。実行時には動的プロファイリング情報を採取することでどの関数をインライン展開すべきかを決定することができる(Javaの HotSpot コンパイラなど)。以下にC言語のソースについて「人間の手」でインライン展開を試みた例を示す: int pred(int x) ''インライン展開前:'' int f(int y) ''インライン展開後:'' int f(int y) これは単なる例である。実際のC言語ではパラメータ付きマクロやインライン関数機能を使ってコンパイラ(あるいはプリプロセッサ)にこのような変換をさせる。以下では、このコードに施せる最適化についても説明する。」の詳細全文を読む スポンサード リンク
|