C++ のインライン関数

Suraj P 2023年10月12日
  1. C++ で inline 関数が使用される理由
  2. C++ でインライン関数を実装する
  3. C++ で constructordestructorinline 関数として実装する
  4. C++ でインライン関数を実装することの長所と短所
C++ のインライン関数

この記事では、C++ のインライン関数、それらを実装する方法、およびそれらを使用することの長所と短所について説明します。

C++ で inline 関数が使用される理由

プログラムを実行するときはいつでも、CPU は関数呼び出しに続いて命令のメモリアドレスを保存します。引数をスタックにコピーし、制御を指定された関数に転送します。

次に、CPU はコードを実行し、特定のメモリ位置で値を返し、呼び出された関数に再び戻ります。ほとんどの時間が関数の実行ではなく切り替えに費やされる場合、余分なオーバーヘッドが発生する可能性があります。

ほとんどの時間は実行にのみ費やされるため、このオーバーヘッドは、複雑な CPU 集約型タスクを実行する大規模な関数では重要ではありません。

ただし、基本的なタスクのみを実行する小さな関数が多数ある場合、このオーバーヘッドは重要になります。ほとんどの時間は切り替えに費やされ、実行にはほとんどまたはまったく時間が費やされません。

したがって、インラインの概念は、スイッチング時間を節約し、効率を高めるための小さな機能が多数ある場合に便利です。

コンパイル時にコードでインラインとして宣言されている関数がある場合は常に、関数呼び出しでアドレスを割り当てる代わりに、関数コード全体をコピーしてその場所に配置します。

構文:

inline return_type function_name(arguments)
{
...
}

インライン関数はコンパイラへの要求にすぎないため、コンパイラは次の場合にそれを無視できます。

  1. 関数には静的変数があります。
  2. 関数には goto または switch ステートメントがあります。
  3. 関数は再帰的です。
  4. 関数にループがあります。

インラインの概念は、一般的にクラスで使用されます。

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++ で constructordestructorinline 関数として実装する

上記の例を使用し、クラスを定義しながらクラスの外部で inline 関数を作成すると、constructordestructorinline として作成することもできます。

コード例:

#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++ でインライン関数を実装することの長所と短所

それでは、インライン関数を実装することの利点のいくつかを見てみましょう。

  1. 関数呼び出しのオーバーヘッドが削減されます。
  2. 関数からのリターン呼び出しのオーバーヘッドを節約します。
  3. スタックで変数をプッシュおよびポップするオーバーヘッドを節約します。

便利ですが、いくつかの欠点もあります。

  1. ここで同じコードの重複が発生するため、インライン関数を多すぎると、バイナリ実行可能ファイルのサイズが大きくなる可能性があります。
  2. インライン関数が多すぎると、命令のキャッシュヒット率が低下する可能性があり、キャッシュメモリからプライマリメモリへの命令フェッチの速度に影響します。
  3. 速度よりもコードサイズが重要な組み込みシステムでは、インライン関数は役に立ちません。
  4. スラッシングが発生し、コンピュータのメモリパフォーマンスが低下する可能性があります。
著者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

関連記事 - C++ Function