インライン関数
関数のインライン展開
Cプログラマの多くは、1行程度で終了する簡易関数はマクロで実装したと思います
C言語のマクロ関数は、短い関数で関数のオーバーヘッドを避ける手段の一つでした
しかし、マクロ関数は仮引数の展開を正確に行うために括弧をつけます
そこでC++で、マクロ関数のような処理を必要とする場合インライン関数が有効です
(もちろん、Cに慣れ親しんでいるのならマクロでもかまわないが)
インライン関数は、実際に呼び出すことはなく呼び出しごとにインラインで展開する関数です
マクロとは異なり関数と同様の扱いで仮引数などを指定することが可能です
これによって、関数の呼び出しや仮引数のオーバヘッドタイムを減少させることができます
インライン関数の宣言は、関数の先頭に inline 指定子を指定します
inline type function();
これで、短い関数の呼び出しにかかるオーバヘッドをなくすことができます
ただし、inlineを指定すれば必ずインライン関数になるわけではなく
必ずコンパイラの制限に従う必要があります(コンパイラのマニュアルを参照)
インライン展開できなかった場合は、通常の関数として扱われます
#include <iostream>
using namespace std;
inline int func(int x) {
return x + (int)(x * 0.05);
}
int main() {
cout << func(100);
return 0;
}
このプログラムでは、消費税を返すインライン関数 func() を宣言しています
func() は、呼び出されるごとにインラインで展開されます
C++ 言語では、マクロ関数よりもインライン関数を用いるのが一般的です
メンバ関数のインライン化
メンバ関数も、通常の関数同様にインライン関数として定義することができます
メンバ関数のインライン化の場合、通常はクラス内部で内容を定義してしまいます
class class-name {
type member_f() {
statements...;
}
};
member_f() は、クラスの内部で宣言されているメンバ関数です
さらに、クラス内で定義したメンバ関数の場合は inline を指定しなくても
自動的にインライン化されます。(もちろん、inline キーワードを指定してもよい)
#include <iostream>
using namespace std;
class Kitty {
public:
int func(int x) {
return x + (int)(x * 0.05);
}
} obj ;
int main() {
cout << obj.func(100);
return 0;
}
クラス内で定義された関数は、インライン化可能であれば自動的にインライン関数になり
インライン化できなかった場合、通常の関数として扱われます
inline
インライン関数を要求します
必ずしもインライン関数になるわけではありません
インライン関数は、呼び出しが関数本体のコードに置き換えられます