こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

インライン関数の使い道と理屈

#include <iostream>
using namespace std;

//max関数の定義
inline int max(int x, int y){if(x>y) return x; else return y;}

int main(){
int num1, num2, ans;
cout << "1番目の整数を入力して下さい。\n";
cin >> num1;

cout <<"2番目の整数を入力して下さい。\n";
cin >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
インライン関数の処理は呼び出し部分に埋め込まれるので、プログラムの処理速度が
向上することがありますとあるんですが、
どのような時にインライン関数は使用するのでしょうか?
理由もしくみもご教示お願いします。

投稿日時 - 2018-07-12 12:43:44

QNo.9517530

困ってます

質問者が選んだベストアンサー

理由と仕組みをいいましょう。

普通サブルーチンというのは int max()というような定義をしておき、呼び出しますが、このとき機械語ではどうなるかというと、max(num1,num2)を書かれたとき、num1とnum2の数値をスタックにプッシュし、いま実行しているアドレスをさらにプッシュしてコールします。よばれたサブルーチンは、まずその戻り番地をポップして、最後はここに戻せばいいなと考え、num2とnum1をポップして取り出して、ここで計算をした上戻り値にその値を設定して覚えていた戻り番地に跳ね返します。

インライン関数は、外に実態はありません。inlineで定義されたものをコンパイラが覚えていて、その文字をかかれたら、ここでその処理のコード自体を、その場所に直接書くのです。

当然スタックをプッシュポップなんて必要ありませんし、ここでやるんだから戻り値の意識もしないですみます。

そりゃ処理は早くなります。

しかし、インラインにした場合弊害が生じることもあります。
何度もその処理を呼ぶ場合です。書かれる都度そこに直接コードが書き込まれますので無駄にメモリが消費されます。サブルーチンみたいに一か所にまとまっていたほうが無駄に場所を食わないということがあります。

それと、リカーシブ処理ができないということもあります。
たとえばディレクトリ構造みたいなものを処理するとき、このディレクトリの直下を見て何かをしろ、という関数recdirなんていうのをサブルーチンで組むと、そのなかで見ているファイルらしきもののなかにディレクトリがあったら、自分がまたrecdirを呼ぶ、と書けば、最終的にディレクトリが途切れるところまで何度も同じ処理を繰り返すことができます。これがリカーシブ(自分が自分を呼ぶ)ですが、インラインの場合このような処理は無理です。スタックして戻るという処理がないので、自分を呼ぶことはできません。

投稿日時 - 2018-07-12 16:09:03

お礼

なるほど、よく解りました、ありがとうございます。
回答ありがとうございます。

投稿日時 - 2018-07-12 19:46:32

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

関数を呼び出すという動作は、
・現在の実行しているプログラムの場所(アドレス)を退避
・関数の場所に飛ぶ
・終了時、退避しているアドレスを復帰し継続する
少なくともこれをします。

さらには、
コンパイル時のオプションにもよりますが、アドレスだけでなく
演算の際に使用するアキュムレーターなど、
さまざまなCPUの情報を一時的に退避し、
復帰する手続きをすることが多いです。

これらがインラインになった場合、退避する処理は省略されたり、
一部に簡略されますから、処理の速度は良くなる可能性があります。

コンパイラがインライン化を選ぶ例としては、
ループなど繰り返しの処理内で関数を呼び出す場合です。


ご案内した内容は、概念程度のものとご理解ください。
より実感するには、コンパイル後のマシン語になったものを
見比べると良いかもしれません。
コンパイラのオプションで、速度重視と、プログラムサイズの
最小化などをオンオフします。

投稿日時 - 2018-07-12 14:42:39

お礼

とても細かい事がよく解りました。
回答ありがとうございます。

投稿日時 - 2018-07-12 19:48:48

ANo.2

普通の関数は呼び出して戻ってくるということをしますよね。
インライン関数は呼び出さずにその場で実行されます。

なので呼び出して戻るという手間がかからないので速いのです。
もちろん、処理系(OSやコンパイラー)によってその機能が発揮されるかは
保証されていません。

投稿日時 - 2018-07-12 13:16:45

お礼

回答ありがとうございます、
為になります。

投稿日時 - 2018-07-12 19:49:48

ANo.1

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
参考程度までに読み流してください

投稿日時 - 2018-07-12 13:08:53

お礼

回答ありがとうございます。
参考のページを探して頂いてありがとうございました。

投稿日時 - 2018-07-12 19:50:53