C++のインライン関数とは?メリットと使い方を徹底解説
C++のインライン関数の基本
C++のインライン関数(inline function)は、クラスと組み合わせてよく使われる強力な機能です。関数をインラインとして宣言すると、コンパイラはコンパイル時に、その関数が呼び出される箇所すべてに関数コードのコピーを埋め込みます。
そのため、インライン関数に変更を加えた場合、関数を利用しているすべてのコードを再コンパイルする必要が生じることがあります。再コンパイルを行わないと、コンパイラが新しいコードに置き換えられず、古い機能のまま動作し続けるからです。
インライン関数の定義方法
関数をインライン化するには、関数名の前にinlineキーワードを付け、その関数が呼び出される前に定義しておきます。なお、定義された関数が複数行にわたる場合、コンパイラはinline指定を無視することがあります。
また、クラス定義の中で関数を定義した場合、inline指定子を明示しなくても、その関数は自動的にインライン関数として扱われます。
インライン関数の使用例
以下は、インライン関数を使って2つの数値の最大値を返すサンプルコードです。
#include <iostream>
using namespace std;
inline int Max(int x, int y) {
return (x > y)? x : y;
}
// プログラムのメイン関数
int main() {
cout << "Max (20,10): " << Max(20,10) << endl;
cout << "Max (0,200): " << Max(0,200) << endl;
cout << "Max (100,1010): " << Max(100,1010) << endl;
return 0;
}実行結果
Max (20,10): 20 Max (0,200): 200 Max (100,1010): 1010
インライン関数を使うメリット
それでは、コードにインライン関数を取り入れることで得られる主な利点を見ていきましょう。
関数呼び出しのオーバーヘッドが発生しない:通常の関数呼び出しに伴う処理コストを削減できます。
スタック操作の負荷を軽減:関数呼び出し時に変数をスタックにプッシュ・ポップするオーバーヘッドを節約できます。
戻り処理のコストを削減:関数からのリターン呼び出しに伴うオーバーヘッドも省略できます。
文脈に応じた最適化が可能:インライン関数として展開されたコードに対しては、コンパイラが呼び出し元の文脈に合わせた最適化を行える場合があります。通常の関数では、この種の最適化は行われません。
組み込みシステムに有効:小規模なインライン関数は、関数呼び出しの前処理や戻り処理のコードよりも少ないコード量になることがあり、組み込みシステム開発で特に有用です。
まとめ
インライン関数は、関数呼び出しのオーバーヘッドを排除し、パフォーマンス向上に貢献する便利な機能です。特に短い関数を頻繁に呼び出す場面や、リソースが限られた組み込み環境で効果を発揮します。ただし、コードが各呼び出し箇所に展開されるため、大きな関数をインライン化すると実行ファイルのサイズが増大する点には注意が必要です。
-
C++のlog()関数とは?自然対数を求める方法をわかりやすく解説
C++の標準ライブラリには、数学的な計算を行うための便利な関数が多数用意されています。その中でもlog()関数は、数値の自然対数(ネイピア数 e を底とする対数)を求めるために使用される重要な関数です。log()関数の基本情報C/C++のライブラリ関数 double log(double x) は、引数 x の自然対数(底が e の対数)を返します。この関数を使用するには、ヘッダーファイル <cmath> をインクルードする必要があります。関数の宣言double log(double x)パラメータと戻り値パラメータ: x は浮動小数点型(double)の値です。自然対数を求めたい
-
C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説
swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s