解決済み

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

  • 困ってます
  • 質問No.9517530
  • 閲覧数114
  • ありがとう数8
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 37% (25/66)

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

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

  • 回答No.4

ベストアンサー率 39% (2430/6081)

他カテゴリのカテゴリマスター
理由と仕組みをいいましょう。

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

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

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

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

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

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

お礼率 37% (25/66)

なるほど、よく解りました、ありがとうございます。
回答ありがとうございます。
投稿日時 - 2018-07-12 19:46:32
Be MORE 7・12 OK-チップでイイコトはじまる

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 45% (488/1066)

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

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

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

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


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

お礼率 37% (25/66)

とても細かい事がよく解りました。
回答ありがとうございます。
投稿日時 - 2018-07-12 19:48:48
  • 回答No.2

ベストアンサー率 19% (807/4158)

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

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

お礼率 37% (25/66)

回答ありがとうございます、
為になります。
投稿日時 - 2018-07-12 19:49:48
  • 回答No.1

ベストアンサー率 37% (127/337)

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
参考程度までに読み流してください
お礼コメント
7b0m1z4c

お礼率 37% (25/66)

回答ありがとうございます。
参考のページを探して頂いてありがとうございました。
投稿日時 - 2018-07-12 19:50:53
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ