SIMPLE 0 シリーズ : ザ・備忘録

仕事の事を書くし、勉強した事もかくよ

マクロ関数とインライン関数について

マクロ関数とインライン関数がよく比較されているので、使い方も含めもう一度勉強がてらまとめる


マクロ関数

”#define = 文字の並びを他の文字に変換する = マクロ置換”

という事で、#defineで宣言された関数がマクロ関数と考えていいと思う。


#define定義されるものは以下の2つに分けられる

  • オブジェクト形式マクロ
#define マクロ名 置換後の文字の並び

#define YEAR 2017
  • 関数形式マクロ
#define マクロ名(引数のリスト) 置換後の文字の並び

#define SIZE_OF_ARRAY(array)  (sizeof(array)/sizeof((array)[0]))

今までオブジェクト形式マクロしか用いていませんでしたが、
以下のサイトで書いてるように、マクロ関数にする方が
処理速度が速くなる等メリットがあるようです


d.hatena.ne.jp

oshiete.goo.ne.jp

インライン関数

インライン関数は小さい関数で使うことをMSDNでは推奨されており、
オーバーヘッド削減効果がある関数として紹介されています


宣言方法

inline 関数宣言文


上記方法でinline関数の宣言はできるが、inline化ができるかはコンパイラ次第。

※メンバ変数もインライン関数化が可能

class class-name {
	type member_f() {
		statements...;
	}
};


参照元HP
インライン関数

使い分けについて

https://msdn.microsoft.com/ja-jp/library/bw1hbe6y.aspx

MSDNでは以下のように記されてる

インライン関数はマクロに似ていますが、インライン関数がコンパイラによって解析されるのに対し (関数コードはコンパイル時に呼び出しの時点で展開されるため)、マクロはプリプロセッサによって展開されます。 
そのため、これらにはいくつかの重要な違いがあります。

インライン関数は、通常の関数に適用されるタイプ セーフのすべてのプロトコルに従います。

インライン関数は、他の関数と同じ構文を使用して指定されますが、関数宣言に inline キーワードを指定する点が異なります。

インライン関数に引数として渡された式は、1 回だけ評価されます。 マクロでは、引数として渡された式が複数回評価される可能性があります。