インライン関数

インライン関数（）とは、プログラミング言語の言語機能および構文の一種で、コンパイラに対して特定の関数をインライン展開するよう指示するものである。つまり、コンパイラに対して、その関数を呼び出している全ての箇所に関数の実体を挿入するよう指示する。
意義.
インライン展開は、関数呼び出しにかかるオーバーヘッドを無くす目的で行われる。一般に関数の処理内容自体が非常に小さくオーバーヘッドの割合が無視できない場合に使われる。非常に小さい関数の場合、メモリ使用量を削減することもでき、各種最適化を施す上でも有利である。
インライン関数がない場合、プログラマはどの関数をインライン展開すべきかを指定できず、コンパイラが勝手に判断することになる。インライン関数機能があれば、そのアプリケーション固有の知識を元にして（どの関数がよく使われるかなど）、インライン展開すべき関数を決定できる。
また、言語によってはインライン関数はコンパイルモデルと密接に関連している。例えばC++では、インライン関数はモジュール単位に定義する必要がある（通常の関数は1つのモジュールで定義すればよい）。これにより、モジュール単位に独立したコンパイルができるようになっている。
マクロとの比較.
古いC言語（C89）などでは、インライン展開をソースレベルの引数付きマクロで実現してきた。インライン関数はマクロに比べて次のような利点がある。
これらの利点は、マクロを使用したジェネリックプログラミングに対する、C++の関数テンプレートのメリットと同様である。
C++の設計者ビャーネ・ストロヴストルップは、マクロよりもインライン関数を使うべきだと主張している。
言語サポート.
C++およびC99以降のC言語は codice_1 キーワードによるインライン関数を標準サポートしている。Microsoft Visual C++はバージョン2017においてもC99をフルサポートしておらず、C言語モードでは codice_1 キーワードをサポートしていないが、代わりにインライン関数は独自拡張の codice_3 キーワードで対応している。Microsoft Visual C++やg++などは、インライン関数として指定されていなくてもインライン展開すべき関数を自動的に展開するオプションを用意している。Adaでは codice_4 をインライン関数として使うことができる。Delphi (Object Pascal) はバージョン2005以降でインライン関数のサポートを追加した。JavaやJavaScriptは言語仕様には存在しないが、JITコンパイラが最適化の一環でインライン展開することもある。OracleのJava SEコンパイラはインラインディレクティブオプションをサポートする。関数型言語など他の多くの言語はインライン関数をサポートしていないが、インライン展開を積極的に行うことが多い。インライン展開の方針はコンパイラによって異なる。
C99/C++でのインライン関数の定義例および使用例を以下に示す。
inline int max(int a, int b) {
 if (a &gt; b)
 return a;
 else
 return b;
int x = 1, y = -2;
int z = max(x--, y); // 1
C++ではクラスおよび構造体のインラインメンバー関数を定義することもできる。クラスおよび構造体の型定義内に直接実装を記述したメンバー関数は、暗黙的にcodice_1となる。
class MyClass {
 int m_number1;
 int m_number2;
public:
 int getNumber2() const { return this-&gt;m_number2; } // 暗黙的に inline となる。
 int getSum() const;
C++では、関数テンプレート、コンパイラが暗黙的に宣言と定義を自動生成した、C++11以降のcodice_6関数も暗黙的にcodice_1である。
問題点.
インライン展開にまつわる問題だけでなく、インライン関数は言語機能として積極的に使用されない一面がある。その理由は次の通りである:
インライン展開そのものの問題についてはインライン展開の欠点を参照されたい。