C++ のインライン関数
-
C++ で
inline
関数が使用される理由 -
C++ で
インライン
関数を実装する -
C++ で
constructor
とdestructor
をinline
関数として実装する -
C++ で
インライン
関数を実装することの長所と短所
この記事では、C++ のインライン
関数、それらを実装する方法、およびそれらを使用することの長所と短所について説明します。
C++ で inline
関数が使用される理由
プログラムを実行するときはいつでも、CPU は関数呼び出しに続いて命令のメモリアドレスを保存します。引数をスタックにコピーし、制御を指定された関数に転送します。
次に、CPU はコードを実行し、特定のメモリ位置で値を返し、呼び出された関数に再び戻ります。ほとんどの時間が関数の実行ではなく切り替えに費やされる場合、余分なオーバーヘッドが発生する可能性があります。
ほとんどの時間は実行にのみ費やされるため、このオーバーヘッドは、複雑な CPU 集約型タスクを実行する大規模な関数では重要ではありません。
ただし、基本的なタスクのみを実行する小さな関数が多数ある場合、このオーバーヘッドは重要になります。ほとんどの時間は切り替えに費やされ、実行にはほとんどまたはまったく時間が費やされません。
したがって、インライン
の概念は、スイッチング時間を節約し、効率を高めるための小さな機能が多数ある場合に便利です。
コンパイル時にコードでインライン
として宣言されている関数がある場合は常に、関数呼び出しでアドレスを割り当てる代わりに、関数コード全体をコピーしてその場所に配置します。
構文:
inline return_type function_name(arguments)
{
...
}
インライン
関数はコンパイラへの要求にすぎないため、コンパイラは次の場合にそれを無視できます。
- 関数には静的変数があります。
- 関数には
goto
またはswitch
ステートメントがあります。 - 関数は再帰的です。
- 関数にループがあります。
インライン
の概念は、一般的にクラスで使用されます。
C++ でインライン
関数を実装する
コード例:
#include <iostream>
using namespace std;
class myClass {
int a, b;
public:
void sum();
};
inline void myClass::sum() {
cout << "Enter first value:";
cin >> a;
cout << "Enter second value:";
cin >> b;
cout << "Sum of two numbers is " << a + b << endl;
}
int main() {
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
上記のコードでは、関数を定義するときにインライン
として宣言しました。これは、実際のインライン
関数定義をクラス内よりもクラス外に記述することをお勧めするためです。
ただし、クラス内の関数定義は、inline
キーワードを使用しなくても、デフォルトでは inline
関数定義です。
出力:
Program using inline function
Enter first value:12
Enter second value:13
Sum of two numbers is 25
C++ で constructor
と destructor
を inline
関数として実装する
上記の例を使用し、クラスを定義しながらクラスの外部で inline
関数を作成すると、constructor
と destructor
を inline
として作成することもできます。
コード例:
#include <iostream>
using namespace std;
class myClass {
int a, b;
public:
myClass();
~myClass();
void sum();
};
inline myClass::myClass() {
a = 100;
b = 200;
}
inline myClass::~myClass() { cout << "destroying the object\n"; }
inline void myClass::sum() {
cout << "Sum of two numbers is " << a + b << endl;
}
int main() {
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
出力:
Program using inline function
Sum of two numbers is 300
destroying the object
C++ でインライン
関数を実装することの長所と短所
それでは、インライン
関数を実装することの利点のいくつかを見てみましょう。
- 関数呼び出しのオーバーヘッドが削減されます。
- 関数からのリターン呼び出しのオーバーヘッドを節約します。
- スタックで変数をプッシュおよびポップするオーバーヘッドを節約します。
便利ですが、いくつかの欠点もあります。
- ここで同じコードの重複が発生するため、
インライン
関数を多すぎると、バイナリ実行可能ファイルのサイズが大きくなる可能性があります。 - インライン関数が多すぎると、命令のキャッシュヒット率が低下する可能性があり、キャッシュメモリからプライマリメモリへの命令フェッチの速度に影響します。
- 速度よりもコードサイズが重要な組み込みシステムでは、
インライン
関数は役に立ちません。 - スラッシングが発生し、コンピュータのメモリパフォーマンスが低下する可能性があります。