列をなして
キーワードインラインタイプの関数が返す、すなわち、関数がインライン関数に指定することができる前に、C ++キーワードインライン、関数宣言または定義です。それは頻繁に呼び出される関数がスタック領域(スタックメモリ)を大量に消費する問題の一部を解決することができます。キーワードのインライン関数定義は、関数インライン関数を作るために一緒に配置されなければならない効果がありませんだけで、インライン関数宣言の前に、。インラインは、キーワードではなく、「宣言するために使用される」キーワード「達成のため」です。
function_inline:グローバル関数の例をエラー
inline void function_inline();
void function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
グローバル正しく機能例:function_inline
inline void function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
機能エラー部材の例:class_inline :: function_inline
//class_inline.h
class class_inline
{
public:
inline void function_inline();
};
//class_inline.cpp
void class_inline::function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
機能の例として、正しくメンバー:class_inline :: function_inline
おすすめ!
//class_inline.h
class class_inline
{
public:
inline void function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
};
お勧めできません!
//class_inline.h
class class_inline
{
public:
inline void function_inline();
};
//class_inline.cpp
inline void class_inline::function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
お勧めできません!
//class_inline.h
class class_inline {
public:
void function_inline();
};
//class_inline.cpp
inline void class_inline::function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << std::endl;
}
インライン関数はコンパイラにちょうど提案ですので、最終的には本当にインライン、コンパイラの平均値を見ることができ、それは機能が複雑ではありません信じていた場合、呼び出しの時点で展開することができ、あなたは本当に、インライン、内にその文を意味するものではありませんでしょうユナイテッドはばかりの提案共同宣言の中に、インラインになります。
有効で指定インライン関数(C99 6.7.4)を使用して作られた程度まで提案。
- -fno-インラインオプションを使用する場合は-O0が使用されている場合GCCは、任意の関数をインライン化しません。そうしないと、GCCは、まだ多くの理由のための機能をインライン化できないことがあります。-Winlineオプションは、関数がインライン展開と理由はないされていないかどうかを判断するために使用することができます。
幸運なことに、ほとんどのコンパイラの診断レベルを提供します:あなたは、彼らがインライン技術を機能しません頼めば、あなたに警告メッセージを表示します。
インライン制限
単純なコードを使用して、インライン関数本体の数のハン。しない制御文一方、スイッチ、例えば、複雑な構造を含み、インライン関数自体は、直接再帰関数(すなわち、また、独自の内部機能を呼び出す)ことができないことはできません。そして、すべての(最もありふれた以外、ほとんど何も行わないための)仮想関数がインラインを防ぐことになります。「実行時まで待ってから、コールにどの機能を決定する、」バーチャルな手段なので、それはインラインの意味「コンパイル時に、身体の関数呼び出しに置き換えられるためにアクションを呼び出します。」コンパイラが決定を下す場合は、まだ呼び出し機能かわからない、インライン関数を作るためにそれらを指示することは困難です。
注意インライン
インライン関数は、それによって機能の効率を向上させる、関数呼び出しのオーバーヘッドを排除を犠牲にして効率、符号拡張(コピー)を改善することです。関数呼び出しのオーバーヘッドに比べてコードの関数本体の実行時間が、大きい場合、効率の向上は非常に制限されます。一方、インライン関数内のすべての呼び出しは、プログラムが増加するコードの総量を、コードをコピーする必要があり、より多くのメモリ空間を消費します。したがって、裁量を使用する必要があります。
次のような状況は、使用済みのインラインすべきではありません。
- (1)機能コードがコスト高につながるインラインメモリ消費量を使用して、比較的長いin vivoである場合。
- (2)関数本体は、大きなよりも関数呼び出しのオーバーヘッドのコード内で機能を実行するための時間をサイクルに表示された場合。
- インラインで使用することがより有効な紛らわしいの(3)コンストラクタとデストラクタ。コンストラクタとデストラクタは、オブジェクトのクラスまたはグループの「密かに」コンストラクタの実装とデストラクタメンバなどのいくつかの行動を隠すことができる注意してください。したがって、定義体は、クラス宣言でコンストラクタとデストラクタではありません。
良いコンパイラは、(さらに、インライン関数宣言に表示されてはならない示す)自動的に解除インライン価値、身体機能の定義に基づいて説明します。その「インライン関数はコンパイラにちょうど提案ですので、最終的には本当にインライン、コンパイラの平均値を見ることができる」インラインを使用してマクロをコンパイルする明確な必要性がある場合に、使用__forceinline __attribute __((always_inline)
__forceinline
インライン関数のコンパイラの試みは、関係なく、特徴的な機能の、いくつかのケースでは、コンパイラは、__forceinlineを無視することを選択するのではなく、インライン関数があります。例えば:
- 再帰関数は、自分自身の中にインライン化されません。
- コントロールのはalloca()関数ではありません使用してください。
コンパイルマクロが(ある場合はCOMPLIE_ZMODULE_NAMEの時間)に置き換え、それは必須インラインデバッグバージョンを確保するのが最善の方法です(追加しても、インライン関数をコンパイルしていない、インラインで、その結果、およびリリースバージョン(インライン関数のために最適化されてもよい)キーワードは)COMPLIE_ZMODULE_NAMEコンテンツの違いは問題を引き起こします。
__forceinline void function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << "COMPLIE_ZMODULE_NAME:" << COMPLIE_ZMODULE_NAME << std::endl;
}
__attribute __((always_inline)
インライン関数のコンパイラ試みは関係なく、特性関数の、いくつかのケースでは、コンパイラは、例えば、インライン関数なしで、__attribute __((always_inline)関数属性を無視することを選択することができます。
- 再帰関数は、自分自身の中にインライン化されません。
- コントロールのはalloca()関数ではありません使用してください。
コンパイルマクロが(ある場合はCOMPLIE_ZMODULE_NAMEの時間)に置き換え、それは必須インラインデバッグバージョンを確保するのが最善の方法です(追加しても、インライン関数をコンパイルしていない、インラインで、その結果、およびリリースバージョン(インライン関数のために最適化されてもよい)キーワードは)COMPLIE_ZMODULE_NAMEコンテンツの違いは問題を引き起こします。
inline void __attribute__((always_inline)) function_inline()
{
std::cout << __FILE__ << ":" << __LINE__ << "/" << __FUNCTION__ << "COMPLIE_ZMODULE_NAME:" << COMPLIE_ZMODULE_NAME << std::endl;
}