マクロ関数とインライン関数について
マクロ関数とインライン関数がよく比較されているので、使い方も含めもう一度勉強がてらまとめる
マクロ関数
”#define = 文字の並びを他の文字に変換する = マクロ置換”
という事で、#defineで宣言された関数がマクロ関数と考えていいと思う。
#define定義されるものは以下の2つに分けられる
- オブジェクト形式マクロ
#define マクロ名 置換後の文字の並び
例
#define YEAR 2017
- 関数形式マクロ
#define マクロ名(引数のリスト) 置換後の文字の並び
例
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof((array)[0]))
今までオブジェクト形式マクロしか用いていませんでしたが、
以下のサイトで書いてるように、マクロ関数にする方が
処理速度が速くなる等メリットがあるようです
インライン関数
インライン関数は小さい関数で使うことをMSDNでは推奨されており、
オーバーヘッド削減効果がある関数として紹介されています
宣言方法
inline 関数宣言文
上記方法でinline関数の宣言はできるが、inline化ができるかはコンパイラ次第。
※メンバ変数もインライン関数化が可能
class class-name { type member_f() { statements...; } };
使い分けについて
https://msdn.microsoft.com/ja-jp/library/bw1hbe6y.aspx
MSDNでは以下のように記されてる
インライン関数はマクロに似ていますが、インライン関数がコンパイラによって解析されるのに対し (関数コードはコンパイル時に呼び出しの時点で展開されるため)、マクロはプリプロセッサによって展開されます。 そのため、これらにはいくつかの重要な違いがあります。 インライン関数は、通常の関数に適用されるタイプ セーフのすべてのプロトコルに従います。 インライン関数は、他の関数と同じ構文を使用して指定されますが、関数宣言に inline キーワードを指定する点が異なります。 インライン関数に引数として渡された式は、1 回だけ評価されます。 マクロでは、引数として渡された式が複数回評価される可能性があります。