Next: , Previous: , Up: Functions   [Contents][Index]


13.13 インライン関数Inli

インライン関数(inline function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照)、その関数の定義が呼び出し側に展開されます。インライン関数を定義するには、defunのかわりにdefsubstを使用します。

Macro: defsubst name args [doc] [declare] [interactive] body…

このマクロはインライン関数を定義する。マクロの構文はdefunとまったく同じ(Defining Functionsを参照)。

関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります、が欠点もありその1つは柔軟性の減少です。その関数の定義を変更すると、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用することになります。

もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数で顕著なので、一般的に大きな関数をインライン化するべきではありません。

インライン関数はデバッグ、トレース、アドバイス(Advising Functionsを参照)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であってdefunの使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきではありません。

インライン関数を定義した後そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。

インライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照してください)を定義するためにdefmacroを使用できます。しかし式内でのマクロの直接の使用には制限があります — applymapcarなどでマクロを呼び出すことはできません。通常の関数からマクロへの変換には余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defundefsubstに置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのようにbodyで引数を何回使用するかを心配する必要はありません。

defsubstの代替えとして、完全なコンパイラーマクロを通じて関数を定義するdefine-inlineを使用できます、define-inlineを参照してください。