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

このQ&Aのポイント
  • インライン関数の使い道や理屈について知りたいです。
  • インライン関数は処理速度を向上させるために使用されることがあります。
  • どのような場合にインライン関数が使用されるのか、その理由としくみを教えてください。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.4

理由と仕組みをいいましょう。 普通サブルーチンというのは int max()というような定義をしておき、呼び出しますが、このとき機械語ではどうなるかというと、max(num1,num2)を書かれたとき、num1とnum2の数値をスタックにプッシュし、いま実行しているアドレスをさらにプッシュしてコールします。よばれたサブルーチンは、まずその戻り番地をポップして、最後はここに戻せばいいなと考え、num2とnum1をポップして取り出して、ここで計算をした上戻り値にその値を設定して覚えていた戻り番地に跳ね返します。 インライン関数は、外に実態はありません。inlineで定義されたものをコンパイラが覚えていて、その文字をかかれたら、ここでその処理のコード自体を、その場所に直接書くのです。 当然スタックをプッシュポップなんて必要ありませんし、ここでやるんだから戻り値の意識もしないですみます。 そりゃ処理は早くなります。 しかし、インラインにした場合弊害が生じることもあります。 何度もその処理を呼ぶ場合です。書かれる都度そこに直接コードが書き込まれますので無駄にメモリが消費されます。サブルーチンみたいに一か所にまとまっていたほうが無駄に場所を食わないということがあります。 それと、リカーシブ処理ができないということもあります。 たとえばディレクトリ構造みたいなものを処理するとき、このディレクトリの直下を見て何かをしろ、という関数recdirなんていうのをサブルーチンで組むと、そのなかで見ているファイルらしきもののなかにディレクトリがあったら、自分がまたrecdirを呼ぶ、と書けば、最終的にディレクトリが途切れるところまで何度も同じ処理を繰り返すことができます。これがリカーシブ(自分が自分を呼ぶ)ですが、インラインの場合このような処理は無理です。スタックして戻るという処理がないので、自分を呼ぶことはできません。

7b0m1z4c
質問者

お礼

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

その他の回答 (3)

  • skp026
  • ベストアンサー率45% (1011/2238)
回答No.3

関数を呼び出すという動作は、 ・現在の実行しているプログラムの場所(アドレス)を退避 ・関数の場所に飛ぶ ・終了時、退避しているアドレスを復帰し継続する 少なくともこれをします。 さらには、 コンパイル時のオプションにもよりますが、アドレスだけでなく 演算の際に使用するアキュムレーターなど、 さまざまなCPUの情報を一時的に退避し、 復帰する手続きをすることが多いです。 これらがインラインになった場合、退避する処理は省略されたり、 一部に簡略されますから、処理の速度は良くなる可能性があります。 コンパイラがインライン化を選ぶ例としては、 ループなど繰り返しの処理内で関数を呼び出す場合です。 ※ ご案内した内容は、概念程度のものとご理解ください。 より実感するには、コンパイル後のマシン語になったものを 見比べると良いかもしれません。 コンパイラのオプションで、速度重視と、プログラムサイズの 最小化などをオンオフします。

7b0m1z4c
質問者

お礼

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

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.2

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

7b0m1z4c
質問者

お礼

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

  • Nobu-W
  • ベストアンサー率39% (725/1832)
回答No.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 参考程度までに読み流してください

7b0m1z4c
質問者

お礼

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

関連するQ&A

  • 合計値を求める関数

    #include<iostream> using namespace std; //sum関数の定義 int sum(int x, int y) { return x + y;  } int main() { int num1, num2, ans; cout << "1番目の整数を入力して下さい。\n"; cin >> num1; cout << "2番目の整数値を入力して下さい。\n"; cin >> num2; ans = sum(num1, num2); cout << "合計は" << ans << "です。\n"; return 0; }  ここのreturn x+y;の所の合計値を戻り値として返す処理の仕組みを解りやすく教えて欲しいです、戻り値はちょっと解りづらいです、よろしくお願いします。

  • {x = x>y ? x:y; return x;}

    #include <iostream> using namespace std; inline int max(int x, int y){x = x>y ? x:y; return x;} int main() { int num1, num2, ans; cout << "2つの整数を入力して。\n"; cin >> num1 >> num2; ans = max(num1, num2); cout << "最大値は" << ans << "です。\n"; return 0; } の{x = x>y ? x:y; return x;}の部分の意味が解りません。

  • 分割コンパイルの手順と方法について

    Visual Studio 2010でファイルを分割してコンパイル、リンクする方法がわかりません。以下のような3つのファイルです。 [myfunc.h] /* max関数の宣言 */ int max(int x, int y); [myfunc.c] int max(int x, int y) { if (x > y) return x; else return y; } [Sample13.c] #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n", ans); return 0; } 以上3つのファイルはあくまでも便宜的なもので、複数のファイルのコンパイル・リンクの手順を具台的に理解するために 用意したものです。

  • C言語/プログラミング

    int Trianglearea(int x, y) { return x * y / 2; } int main() { int x, y, ans; cout << "底辺を入力してください。\n"; cin >> x; cout << "高さを入力してください。\n"; cin >> y; cout << "三角形の面積は" <<Trianglearea(x, y) << "です。\n"; return 0; } これで、実行したらエラー発生しました。エラーを治す方法を教えてください。

  • 誤った関数に関する値渡しについて

    こんにちは、まずはソースを記述します。 #include<iostream> using namespace std; //誤ったswap関数の宣言 void swap(int x, int y); int main() { int num1 = 5; int num2 = 10; cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; cout << "変数num1とnum2の値を交換します。\n"; swap(num1, num2); cout << "変数num1の値は" << num1 << "です。\n"; cout << "変数num2の値は" << num2 << "です。\n"; return 0; } //誤ったswap関数の定義 void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } >>関数内で仮引数xとyの値を交換する処理を行っていても、これは変数num1とnum2の値を「コピー」した5と10を交換しているにすぎません。 swap関数内で値を交換しても、呼び出し元の変数であるnum1とnum2に影響を与えることができません。 ・・の文章の中から質問ですが値渡しとはどういうことでしょうか? 参照渡しとはどう違うのでしょうか? ご教示お願いします。

  • linuxでリンクを貼るには

    linuxでリンクを貼るには 本に書いてある通りにプログラムをつくったのですが、 うまくコンパイルできません。 本で書いてあるのはwindowsのvisual C++で、 僕の使っている環境はlinuxのg++です。 コンパイルした結果を以下に示します。 -- ファイル名:myfunc.h //declaration of the max function int max(int x, int y); -- ファイル名:myfunc.cpp //a definition of the max function int max(int x, int y) { if(x > y) return x; else return y; } -- ファイル名:sample10.5.cpp #include <iostream> #include "myfunc.h" using namespace std; int main() { int num1, num2, ans; cout << "Please input the 1st integer.\n"; cin >> num1; cout << "Please input the 2nd integer.\n"; cin >> num2; ans = max(num1, num2); cout << "The maximum value is " << ans << '\n'; return 0; } -- bash-2.05b$ g++ myfunc.cpp /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../../crt1.o(.text+0x18): In function `_start': : undefined reference to `main' collect2: ld はステータス 1 で終了しました -- bash-2.05b$ g++ sample10.5.cpp /tmp/ccWJNOkX.o(.text+0x6c): In function `main': : undefined reference to `max(int, int)' collect2: ld はステータス 1 で終了しました

  • 関数についての質問です。

    c言語を勉強しています。関数で戻り値がありますが、関数の処理の仕組みが理解できません。本等で勉強し僕の考え方が間違っていたら教えてください。 お願いいたします。 #include <stdio.h> int buy(int x,int y ) { int z; //1 printf("%d万円と%d万円の車を買いました。");//2 z=x+y; //3 return z; //4 } int main(void) { int num1,num2,num;//5 printf("いくらの車をかいますか?\n");//6 scanf("%d",&num1);//7 printf("いくらの車をかいますか?\n");//8 scanf("%d",&num2);//9 sum=buy(num1,num2);//10 printf("合計で%d万円です。\n",sum);//11 return 0;//12 } まず最初に 整数型、int num1,num2,numを読みます。 次に//7と//8で数値を入力します。 そして//10で値を格納し int buy( int x,int y)に値をわたします。 ※正確には関数buyに渡す。 そして計算をし計算結果 zをreturn で int buy(int x,int y )の buyに値を渡します。 そのあと呼び出し元の//10のbuyに値をかえします。 そしてプログラムが終了します。 間違っていたら教えてください。

  • 設定した値が意図せぬ値に

    POJ 3176の問題です。 http://poj.org/problem?id=3176 #include <iostream> #include <algorithm> #define MAX 100 using namespace std; int main() { int n; cin >> n; int line[n-1][MAX]; int num[n-1][MAX]; cin >> line[0][0]; if(n==0) { cout << 0 <<endl; return 0; } else if(n==1) { cout << line[0][0] << endl; return 0; } for (int i =1;i < n;i++) { for (int j=0;j < i+1;j++) { int x; cin >> x; line[i][j]= x; } } for (int k= 0 ; k<n;k++) { num[n-1][k]= line [n-1][k]; } for (int k= n-2; k > 0 ; k--) { for (int l=0 ; l<k+1; l++) { num[k][l] = max (num[k+1][l],num[k+1][l+1]) + line[k][l]; } } num[0][0] = max(num[1][0],num[1][1]) + line[0][0]; cout << line[0][0] <<" "<<num[0][0]<<endl; return 0; } 入力 4 3 1 3 1 2 3 1 3 4 5 出力 1 12 最後に出力でline[0][0]をするようにしているのはバグチェックのためです。 ここで僕がわからないのはどうしてline[0][0]が3で宣言し、ほかでいじっていないにも関わらず、最後に1になっているのかということです。 どなたかわかる方がいらっしゃったらよろしくお願いします。

  • 実行

    こんにちは。私は昨日からC++を始めたのですがなかなかうまくいかないためこちらに質問させていただくことにしました。 #include <iostream.h> int main(void) { int x; int y; cout<<"xを入力: 10"; cin>>x; cout<<"yを入力: 2"; cin>>y; cout<<"x+yは"<<x+y<<"です。\n"; return(0); } このようなプログラムを作成したのですが実行してみたところ、 xを入力: 10 これ以降下までいきません。どうすればうまくいくのでしょうか?宜しくお願いします。

  • C言語 関数の問題

    C言語(関数の問題)で読み込んだ4つの整数の最大値を求めプログラムで 整数を2つペア比較し、関数の入れ子を用いて最大値を見つけて、表示する。 というプログラムを作成したいのですが #include<stdio.h> int maxof(int a, int b) { if(a > b) return (a); else return (b); } int max4(int a, int b, int c, int d) { max(max(a, b), max(c, d)); } int main(void) { int num1,num2, num3, num4; ------ 整数の読み込み printf("最大値は%dです。", max4(num1, num2, num3, num4)); return(0); } と記述すると、上手くいったのですが これを max関数だけを用いて作成できますでしょうか? 整数の比較は全てmax関数で行いたいです。

専門家に質問してみよう