インライン関数

インライン関数

2倍した値を返すような簡単な関数の場合、直接書いた方が処理が速くなります。しかし、単純な命令でも関数にしたほうがコードが見やすくなっていいです。そのような場合、インライン関数を使うと便利です。関数のように書けるが、関数を呼び出さないので処理が速くなります。ここでは、このインライン関数の使い方を紹介します。

インライン関数

いま偶数か奇数かを返す関数

int even(int x){
  return !(x%2);
}

があったとします。このような関数の場合、いちいち関数としてかかずに

!(x%2);

とすればいい気がします。しかも、このように

関数を通さないほうが処理が速くなります。

 しかし、!(x%2)だと一瞬みたときコードの意味がわかりにくですよね。

  1. 処理速度をとるか
  2. コードの見やすさをとるか

というジレンマが生じます。このようなときに便利なのがインライン関数です。

インライン関数の使い方

インライン関数は

inline 戻り値のデータ型 関数名(渡す値){命令}

というように使用します。さきほどの例なら

inline int even(int x){
  return !(x%2);
}

となります。このインライン関数を使うと、even(a)というのをreturn !(a%2)といったようにインラインに命令をかいてくれます。よって、関数を呼び出さないので処理が速いままです。インライン関数なら

  1. 処理が速く
  2. コードが見やすい

というメリットがあるわけです。しかし、

長い処理のインライン関数を多用するとプログラムの容量が大きくなります。

長いインライン関数を一回使用するだけならいいのですが、何回も使用すると使用しただけプログラムが大きくなってしまいます。これがインライン関数のデメリットです。

インライン関数は命令が短い関数のみに使用するようにしましょう。

 ただ、インライン関数が長いとコンパイラが判断すれば、自動的に関数にするのであまり気にしなくてもいいかもしれません。

インライン関数の使用例

以下にインライン関数の使用コード例をのせます。

#include <iostream>
using namespace std;
 
inline int even(int x){
	return !(x%2);
}
 
int main(void){
	int a=5;
    if(even(a)){
		cout<<a<<"は偶数です\n";
	}else{
		cout<<a<<"は奇数です\n";
	}
    return 0;
}

実行すると

5は奇数です

となります。

自動インライン化

クラスを使うときに、単にクラス内のプライベートな値を返すというメソッドがよくでてきます。

そのようなメソッドの場合、インライン化したほうがコードが見やすくなるし、速度も速くなり便利です。

このクラス内のインライン化を自動インライン化といいます。

戻り値 メソッド名(入力値){命令}

として使用します。

では試しに使ってみましょう。

#include <iostream>
using namespace std;

class myclass{
	int a;
public:
	void input(int x){
		a=x;
	}
	int output(){return a;}
};

int main(void){
	myclass myobj;
	myobj.input(3);
	cout<<myobj.output()<<"\n";
    return 0;
}

inputメソッドでプライベート変数aに値を入れて、outputで出力します。これらのメソッドは自動インライン化されています。実行すると以下のようになります。

3

インライン関数はプログラムの高速化に有効なので、機会があれば使っていきましょう。

defineでも簡単な関数を書くことができます。しかし、defineではなくインライン関数を使用するようにしましょう。なぜインライン関数かというと、コンパイラはインライン関数を理解するからです。defineで定義した関数は間違ってもコンパイラがチェックできませんから。

著者:安井 真人(やすい まさと)