C++ では、関数定義にプレフィックスを付けることができる次のような inline キーワードが追加されました。
inline int max_int( int a, int b ) { return a > b ? a : b; }
関数をインライン化することでプログラム全体のパフォーマンスが向上する可能性があるという「ヒント」をコンパイラに提供します。
インライン化された関数は、次の通常の関数呼び出しメカニズムを実行するのではなく、呼び出されるすべての時点でコードが展開されています。
非常に小さい関数の場合、インライン化によりパフォーマンスが向上する可能性があります。 しかし、他のほとんどすべてのものと同様に、トレードオフがあります。
inline キーワードは C99 にバックポートされましたが、要件が若干異なりました。詳細は後ほど説明します。
インライン関数は、関数のようなマクロに似ています (また、関数のようなマクロの多くの用途を置き換えることを目的としています)。 インライン関数は関数であり、C も C++ も理解できないプリプロセッサによって行われる単なるテキスト置換ではなく、完全な関数セマンティクスを備えているため、これは一般に良いことです。
max_int() 関数と単純に等価なマクロ:
#define MAX_INT(A,B) A > B ? A : B /* bad implementation */
には次の問題があります:
さらに、マクロ:
インライン関数にはこれらの問題はなく、同様のパフォーマンス上の利点が得られます。 したがって、関数のようなマクロではなく、インライン関数を使用してください。
前述したように、inline の指定は、関数がインライン化されることでプログラム全体のパフォーマンスが向上する可能性があるというコンパイラーへの「ヒント」にすぎません。 コンパイラはヒントを自由に無視できます。
なぜですか? それは良いアイデアではない、または不可能な場合があるからです。 次のいずれかが true の場合、関数はインライン化されないか、通常はインライン化されません。
他の理由がある可能性があります。それはすべて、関数、その引数、コンパイラ、およびそれに与えられるオプションに大きく依存します。
コンパイラが関数をインライン化できない、またはインライン化しないことを選択した場合、(デフォルトでは) インライン化していないことを警告することはありません。 gcc などの一部のコンパイラには、警告を発し、関数がインライン化されなかった理由を示す -Winline オプションがあります。
inline の指定は、register を指定する古いコードに似ています。どちらも単なるヒントです。
ほとんどの関数では、関数の実行コストの大部分は関数呼び出しメカニズムではなく、関数の本体に発生します。 したがって、関数がインライン化の適切な候補であるためには、一般に次のようにする必要があります:
疑問がある場合は、コードのプロファイリングを行ってください。 インラインの使用は、「速くする」という魔法のキーワードではありません。 さらに、インラインを過度に使用すると、コードが肥大化し、プログラム全体のパフォーマンスが悪化する可能性があります。
詳細については、「インライン疾患」を参照してください。
インライン化の候補となることが多い関数は次のとおりです。
理想的なインライン関数はパフォーマンスを向上させ、かつコード サイズを削減します。
ただし、インライン関数の定義が変更されると、それを使用するすべてのコードを再コンパイルする必要があるという点に注意してください。インライン最適化
In order for the compiler to be able to inline a function, it has to be able to “see” its definition (not just its declaration) in every .c or .cpp file it’s used in just like a macro. Hence, an inline function must be defined in a header file.
Normally, a function, like everything else, must have exactly one definition by adhering to the one definition rule (ODR). However, since the definition of an inline function is “seen” in multiple .c or .cpp files, the ODR is suspended for that function.
It is possible to have different definitions for inline functions having the same name, but this results in undefined behavior since the compiler has no way to check that every definition is the same.
To inline a function in C++, all you need do is prefix the function definition with inline — that’s it. The compiler and/or linker will automatically discard all but one definition from the final executable file for you.
However, to inline a function in C, you additionally must explicitly tell the compiler into what .o file to put the one definition in the event the compiler is either unable or unwilling to inline a function via extern inline.
For example, in exactly one .c file, you would declare a function like:
// util.c extern inline int max_int( int, int );
That tells the compiler to “put the one definition for max_int() into util.o.”
Alternatively in C, you can instead declare an inline function static also:
static inline int max_int( int a, int b ) { return a > b ? a : b; }
If you do this, then:
Inline functions, if used judiciously, can yield performance gains. Generally, only very small functions are good candidates for inlining.
Starting in C++11, inline functions can alternatively be declared constexpr, but that’s a story for another time.
以上がC および C++ のインライン関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。