- ベストアンサー
インライン関数の使い道と理屈
- インライン関数の使い道や理屈について知りたいです。
- インライン関数は処理速度を向上させるために使用されることがあります。
- どのような場合にインライン関数が使用されるのか、その理由としくみを教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
理由と仕組みをいいましょう。 普通サブルーチンというのは int max()というような定義をしておき、呼び出しますが、このとき機械語ではどうなるかというと、max(num1,num2)を書かれたとき、num1とnum2の数値をスタックにプッシュし、いま実行しているアドレスをさらにプッシュしてコールします。よばれたサブルーチンは、まずその戻り番地をポップして、最後はここに戻せばいいなと考え、num2とnum1をポップして取り出して、ここで計算をした上戻り値にその値を設定して覚えていた戻り番地に跳ね返します。 インライン関数は、外に実態はありません。inlineで定義されたものをコンパイラが覚えていて、その文字をかかれたら、ここでその処理のコード自体を、その場所に直接書くのです。 当然スタックをプッシュポップなんて必要ありませんし、ここでやるんだから戻り値の意識もしないですみます。 そりゃ処理は早くなります。 しかし、インラインにした場合弊害が生じることもあります。 何度もその処理を呼ぶ場合です。書かれる都度そこに直接コードが書き込まれますので無駄にメモリが消費されます。サブルーチンみたいに一か所にまとまっていたほうが無駄に場所を食わないということがあります。 それと、リカーシブ処理ができないということもあります。 たとえばディレクトリ構造みたいなものを処理するとき、このディレクトリの直下を見て何かをしろ、という関数recdirなんていうのをサブルーチンで組むと、そのなかで見ているファイルらしきもののなかにディレクトリがあったら、自分がまたrecdirを呼ぶ、と書けば、最終的にディレクトリが途切れるところまで何度も同じ処理を繰り返すことができます。これがリカーシブ(自分が自分を呼ぶ)ですが、インラインの場合このような処理は無理です。スタックして戻るという処理がないので、自分を呼ぶことはできません。
その他の回答 (3)
- skp026
- ベストアンサー率45% (1010/2238)
関数を呼び出すという動作は、 ・現在の実行しているプログラムの場所(アドレス)を退避 ・関数の場所に飛ぶ ・終了時、退避しているアドレスを復帰し継続する 少なくともこれをします。 さらには、 コンパイル時のオプションにもよりますが、アドレスだけでなく 演算の際に使用するアキュムレーターなど、 さまざまなCPUの情報を一時的に退避し、 復帰する手続きをすることが多いです。 これらがインラインになった場合、退避する処理は省略されたり、 一部に簡略されますから、処理の速度は良くなる可能性があります。 コンパイラがインライン化を選ぶ例としては、 ループなど繰り返しの処理内で関数を呼び出す場合です。 ※ ご案内した内容は、概念程度のものとご理解ください。 より実感するには、コンパイル後のマシン語になったものを 見比べると良いかもしれません。 コンパイラのオプションで、速度重視と、プログラムサイズの 最小化などをオンオフします。
お礼
とても細かい事がよく解りました。 回答ありがとうございます。
- maiko0333
- ベストアンサー率19% (839/4401)
普通の関数は呼び出して戻ってくるということをしますよね。 インライン関数は呼び出さずにその場で実行されます。 なので呼び出して戻るという手間がかからないので速いのです。 もちろん、処理系(OSやコンパイラー)によってその機能が発揮されるかは 保証されていません。
お礼
回答ありがとうございます、 為になります。
- Nobu-W
- ベストアンサー率39% (725/1832)
https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E9%96%A2%E6%95%B0 インライン関数について載ってる記事です 【意義】【マクロとの比較】【問題点】・・・ お読み頂くと少しは理解できるかもですっ 他にも・・・ https://jprogramer.com/c-2/3120 とか http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01066.html 参考程度までに読み流してください
お礼
回答ありがとうございます。 参考のページを探して頂いてありがとうございました。
お礼
なるほど、よく解りました、ありがとうございます。 回答ありがとうございます。