インライン関数トピック
/ *
*オペレーティングプラットフォーム:Visual Studio 2015
*リファレンス:「C ++ Primer Plus(Sixth Edition)」、Chuanzhi抜本的なC ++基本コース
* /
ディレクトリ
1.はじめに
あなたにお願いする、インラインインライン関数の前にいえば
質問: constの定数でC ++をある程度定義されたマクロ定数を置き換えることができますが、マクロコードの代替ソリューションが何の断片がありますか?
回答:もちろん、C ++はCへのアップグレードです。C++では、マクロコードフラグメントの代わりにインライン関数を使用することをお勧めします。
2:それでそれをどう使うか?
インライン関数内でC ++のインラインキーワード文の使用、宣言一緒にインラインキーワード必須と機能の定義を、そうでない場合、コンパイラはなり単に無視インライン要求を。如:inline void get();
3.注意
1.インライン関数によって生成されたコードには定義がありません
C ++コンパイラーは、関数が呼び出される場所に直接関数本体を挿入しますインライン関数には、通常の関数呼び出し(プッシュスタック、ジャンプ、リターン)の余分なオーバーヘッドがありません。
したがって、関数本体の実行コストが、スタックのプッシュ、ジャンプ、およびリターンのコストよりもはるかに大きい場合、インライン化は意味がなくなります。
inline void get()
{
printf("Hello\n");
}
int main()
{
get();
/* 相当于 */
{
printf("Hello\n");
}
}
2. C ++コンパイラーは、関数のインライン要求を必ずしも許可しない
インライン関数は、通常の関数の特性(パラメーターチェック、戻り値の型など)を持つ特殊な関数です。インライン関数はコンパイラへのリクエストですが、リクエストなので確実に拒否できるので、コンパイラはこのリクエストを拒否するかもしれません。
3.インラインコードフラグメントとマクロコードフラグメントの違い
インライン関数はコンパイラによって処理され、コンパイルされた関数本体は呼び出し場所に直接挿入されます。
マクロコードフラグメントによる処置前処理、単純なテキスト置換、無し任意コンパイルプロセス。
4. C ++コンパイラはコンパイルおよび最適化できます
最適化をコンパイルするために近代的なC ++コンパイラ、これさえインライン声明のないいくつかの機能、可能性があることコンパイラの中にコンパイルしリンクします。
5. C ++でのインラインコンパイルの制限
- ない任意の形式持つことができるループを
- ない存在することができ、あまりにも多くの条件文を
- 関数本体はないことが大きすぎます
- ないことができADDRESS-機能を実行する操作
- 関数のインライン宣言は、呼び出しステートメントの前になければなりません
6.マクロコードフラグメントのインライン置換により、マクロの副作用を回避できる
プログラムを使用して説明します。
#include "iostream"
using namespace std;
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
inline int myfunc(int a, int b)
{
return a < b ? a : b;
}
int main()
{
int a = 1;
int b = 3;
int c = myfunc(++a, b);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
c = MYFUNC(++a, b);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
system("pause");
return 0;
}
結果: 2つの実行の結果に一貫性がないことがわかります。そのため、#defineを使用してコードブロックを定義すると、特定の副作用が発生する可能性があります。
説明:
結論:
- インライン関数は、コンパイル時に関数が呼び出される場所に関数本体を直接挿入します。
- インラインは単なる要求であり、コンパイラーは必ずしもこの種の要求を許可するわけではありません。
- インライン関数は、通常の関数が呼び出されたときのスタック、ジャンプ、および戻りのオーバーヘッドを排除します。