inline
C++ では、キーワードを使用して関数をインラインとして定義できます。関数が呼び出されるすべての場所に関数の完全な本体を挿入するようにプログラマーがコンパイラーに要求したようなものです。
しかし、私が知っているように、コンパイラはこの要求を尊重する義務はありません。関数がインライン化されていることを保証する方法はありますか?
inline
C++ では、キーワードを使用して関数をインラインとして定義できます。関数が呼び出されるすべての場所に関数の完全な本体を挿入するようにプログラマーがコンパイラーに要求したようなものです。
しかし、私が知っているように、コンパイラはこの要求を尊重する義務はありません。関数がインライン化されていることを保証する方法はありますか?
いいえ。実際に関数をインライン化することは完全な実装の詳細であり、多くの関数をインライン化することはできません。これにより、インライン強制メカニズムの存在が不可能になります。__forceinline
(VC ++)のようなキーワードを提供するコンパイラーでさえ、状況によってはその修飾子を使用して関数をインライン化することはありません。また、このページには、この修飾子の誤用に関する非常に適切な警告が記載されています。
__forceinline
VC++ および__attribute__((always_inline))
g++ での使用
これは標準でカバーされていないため、使用しているコンパイラによって異なります。コンパイラのドキュメントには、関数を強制的にインライン化する機能があるかどうか、およびその使用方法が記載されています。ドキュメントには、テール以外の位置での再帰呼び出しなど、その機能の制限も記載されている必要があります。
関数の定義をヘッダーの宣言に直接入れることにより、関数はインライン化される可能性が最も高くなります。
class TheClass
{
public:
static void DoSomething () // declaration
{
// the function's code (definition) goes here
};
};
// in the same header..
void DoOtherThings () // declaration
{
// the function's code (definition) goes here
}
いずれにせよ、おそらくインライン強制にコンパイラ固有のキーワードを使用したとしても、強力な保証はありません。
100%の保証は、関数をC ++マクロに変換し、関数を参照する代わりにマクロを使用することです。関数に複数の行が\
ある場合は、「マクロ関数」の改行を入れたい場所に(スペースの後に円記号を付けて)配置します。
それを行う方法があるとは想像できません。これは主にコンパイラに依存します。別の解決策は、#defineマクロを使用して関数を定義することです。
Microsoftコンパイラを使用している場合は、ここで説明されているように、__ forceinlineを使用できます:http: //msdn.microsoft.com/en-us/library/z8y1yy88%28v=vs.71%29.aspx
g++や他のコンパイラでインライン化を強制する方法がわかりません。