インライン関数
Top page
☆はじめに

Cにはマクロによる置換があった
C++にはマクロに変わってインライン関数が存在する
マクロには気をつけて使わないと予想に反する結果が返る場合があったが、
インライン関数の場合は関数の文法で記載できるため、
そういったことが解消される
¤ マクロの復習
¤ インライン関数の書き方
¤ インライン関数のメリット


マクロの復習

マクロは基本的に置換である。
使用時はそれを肝に銘じる必要がある
#define Abstract(x) (x++)
というマクロは間違いである
正しくは
#define Abstract(x) ((x)++)
とするべきで、こうしないと
Abstract(a+b)は
a+b++;
と展開されて期待通りの結果が返らない
マクロにはこういった副作用がある
副作用といっても、マクロの文法を理解していればいいだけのことだが
C の文法とは微妙に異なるということが、この問題を大きくしている

インライン関数の書き方

インライン関数は書き方において、標準の関数の書き方と同じになった
「書き方」というよりは、処理のされ方といったほうが良いかもしれないが
その書き方は宣言にinlineとつけるだけ。
inline int Abstract(int x){
	return ++x;
}
x++ではなく++xなのはinline関数とは関係はない
気分的に「return x++;だとreturnのあとに++になるのかなー。」
と、ふと気になってしまっただけの話

見てわかるように、はっきり言って関数そのもの
使い方も関数と同じ。
ちがうのはマクロのようにコンパイル時にプリプロセッサによってすべて
展開され、実体は使った分だけあることになる
つまり、違う場所から呼び出すのではなく、そこに関数を組み込んでしまうのである
当然使用回数に応じてコードも長くなるし、
inline関数が修正した時、違うファイルからそのinline関数を使っていれば
そちらもコンパイルしなおす必要がある
インライン関数のメリット

インライン関数は使えば使うほどコードが長くなり(見た目ではなくてコンパイル後の実質的な量)
修正したらコンパイルしなおす必要があるなどデメリットを述べたが
では見た目もおなじだというのに、なぜ関数を使わないかという疑問がでてくる
インライン関数のメリットは
オーバーヘッドの少なさである
絶対値を求めたり、加算するだけのような関数で
もうすこし現実的にリストやツリーから指定の位置のある要素を取り出すだけの関数などで
しかも大量に呼ぶ関数があった場合、
呼ぶごとに生じるオーバーヘッドが無視できない場合があるかもしれない
そういった場合にインライン関数にしてしまうことで、
オーバーヘッドを解消でき、かつコードの編集もしやすいプログラムが書けることになる
構造体の変数名がかわったとか、そういった場合に、いちいちすべての場所を探すのも
面倒な話なので、そういった面でも活用できるだろう

もちろんすべての関数をインラインにしてしまうとコードの量が気になるが
関数の行数自体は大した事がなければ、
コードの増加量も気にならない程度かもしれない
マクロ同様、うまく付き合えば非常に便利なものとなるだろう

Middle Technologies Lithograph
© Takahiro Kitahara