4

重複の可能性:
C++ のインライン関数の利点?

違いは何ですか

#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
        int x;
        cout << "n Enter the Input Value: ";
        cin>>x;
        cout << "n The Output is: " << exforsys(x);
}

int exforsys(int x1)
{
        return 5*x1;
}

#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
        int x;
        cout << "n Enter the Input Value: ";
        cin>>x;
        cout << "n The Output is: " << exforsys(x);
}

inline int exforsys(int x1)
{
        return 5*x1;
}

これら 2 つの定義は、私が推測するコードでは同じように機能します。インライン関数定義を使用する利点は何ですか?

4

6 に答える 6

11

このinlineキーワードは、関数をインライン化することをコンパイラに提案します。通常、関数が呼び出されると、レジスタの現在の内容がpushedメモリに (コピーされ) ます。関数が戻ると、それらはpopped(コピーされて) 戻されます。

これには少し時間がかかりますが、通常はほとんど時間がかからないため、関数が何を行っても関数呼び出しのオーバーヘッドが小さくなります。非常に小さな関数がタイトなループで 1 秒間に何千回も呼び出されると、これらすべての関数呼び出しの関数呼び出しのオーバーヘッドが合計されることがあります。このような場合、プログラマーは、そのループで関数を呼び出すのではなく、関数の内容を直接ループに入れることをコンパイラーに提案できます。これにより、オーバーヘッドが回避されます。

一部のコンパイラ、特に Microsoft Visual C++ は、inlineキーワードを無視します。Microsoft は、オプティマイザが関数をいつインライン化する必要があるかを知るのに十分スマートであると考えています。関数をインライン化することが本当に必要な場合、Microsoft やその他のベンダーは、独自の関数を提供することがあります。キーワード。Visual C++の__forceinline場合、私の記憶が正しければそうです。ただし、オプティマイザがその関数をインライン化することは悪い考えであると非常に強く感じている場合は、これでも無視できます。

于 2012-12-26T05:41:42.717 に答える
6

コンパイラは、インライン化することでメリットが得られる関数とそうでない関数を判断できるほど賢くなったため、実際の効果は関数のリンクinlineを変更することだけです。デフォルトでは、関数には外部リンケージがあります。inline

inline キーワードは、コンパイラへの単なる提案です。コンパイラは、宣言されていない関数をインライン化するか、宣言されている関数をインライン化しないかを決定できます。inlineinline

于 2012-12-26T05:40:43.877 に答える
0

C++ 言語仕様7.1.2より

インライン指定子を使用した関数宣言は、インライン関数を宣言します。インライン指定子は、呼び出し時点での関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることを実装に示します。

これは、実装がメソッド呼び出しをメソッド本体に置き換えることができることを意味し、通常のメソッド呼び出しプロセスで通常発生するオーバーヘッドを回避します。ただし、インライン置換を行うことは必須ではなく、実装固有です。

呼び出し時にこのインライン置換を実行する実装は必要ありません。ただし、このインライン置換が省略された場合でも、7.1.2 で定義されたインライン関数の他の規則は引き続き尊重されます。

于 2012-12-26T05:46:57.107 に答える
0

さて、インライン関数のコードは、コンパイル時に使用されます。したがって、実行が少し速く、ソース コードの長さは小さいままです。

于 2012-12-26T05:34:56.123 に答える
0

インライン関数を呼び出すと、実行制御をこの関数に移す代わりに、プリプロセッサはそのようなすべての関数呼び出しを実際の関数コードに置き換えます。C++ では、クラス内で関数を定義すると、ループ ステートメントがない限り、デフォルトでインラインになります。

于 2012-12-26T05:36:26.517 に答える
0

インライン関数呼び出しは、文字通りインライン関数自体に置き換えられます。

これはそれをエレガントかつ簡単に説明します。 http://www.cprogramming.com/tutorial/lesson13.html

ウィキペディアの記事も参考になります。 http://en.wikipedia.org/wiki/Inline_function

于 2012-12-26T05:38:01.720 に答える