インライン関数インライン関数(英: inline function)とは、プログラミング言語の言語機能および構文の一種で、コンパイラに対して特定の関数をインライン展開するよう指示するものである。つまり、コンパイラに対して、その関数を呼び出している全ての箇所に関数の実体を挿入するよう指示する。 意義インライン展開は、関数呼び出しにかかるオーバーヘッドを無くす目的で行われる。一般に関数の処理内容自体が非常に小さくオーバーヘッドの割合が無視できない場合に使われる。非常に小さい関数の場合、メモリ使用量を削減することもでき、各種最適化を施す上でも有利である。 インライン関数がない場合、プログラマはどの関数をインライン展開すべきかを指定できず、コンパイラが勝手に判断することになる。インライン関数機能があれば、そのアプリケーション固有の知識を元にして(どの関数がよく使われるかなど)、インライン展開すべき関数を決定できる。 また、言語によってはインライン関数はコンパイルモデルと密接に関連している。例えばC++では、インライン関数はモジュール単位に定義する必要がある(通常の関数は1つのモジュールで定義すればよい)。これにより、モジュール単位に独立したコンパイルができるようになっている。 マクロとの比較古いC言語(C89)などでは、インライン展開をソースレベルの引数付きマクロで実現してきた。インライン関数はマクロに比べて次のような利点がある。
これらの利点は、マクロを使用したジェネリックプログラミングに対する、C++の関数テンプレートのメリットと同様である。 C++の設計者ビャーネ・ストロヴストルップは、マクロよりもインライン関数を使うべきだと主張している。 言語サポートC++およびC99以降のC言語は C99/C++でのインライン関数の定義例および使用例を以下に示す。 inline int max(int a, int b) {
if (a > b)
return a;
else
return b;
}
...
int x = 1, y = -2;
int z = max(x--, y); // 1
C++ではクラスおよび構造体のインラインメンバー関数を定義することもできる。クラスおよび構造体の型定義内に直接実装を記述したメンバー関数は、暗黙的に class MyClass {
int m_number1;
int m_number2;
public:
explicit MyClass(int number1, int number2) : m_number1(number1), m_number2(number2) {}
inline int getNumber1() const { return this->m_number1; }
int getNumber2() const { return this->m_number2; } // 暗黙的に inline となる。
int getSum() const;
};
inline int MyClass::getSum() const { return this->m_number1 + this->m_number2; }
C++では、関数テンプレート、コンパイラが暗黙的に宣言と定義を自動生成した特殊メンバー関数[注釈 2]、C++11以降の 問題点インライン展開にまつわる問題だけでなく、インライン関数は言語機能として積極的に使用されない一面がある。その理由は次の通りである:
インライン展開そのものの問題についてはインライン展開の欠点を参照されたい。 脚注注釈出典
関連項目外部リンク |
Portal di Ensiklopedia Dunia