たとえば、関数 A がある場合、コードのこの時点でこの関数をインライン化する必要があるが、その時点では実行しない (呼び出しを行う) 必要があることをコンパイラに伝えることは可能ですか?
5 に答える
少なくとも移植性がない場合でも、一部の呼び出しをインライン化するようにコンパイラーに選択的に指示することはできません。
コンパイラへの単なる提案であることに注意してくださいinline
。コンパイラは、関数の本体を呼び出しポイントにインラインでインライン化するという提案に従う場合と従わない場合がありますが、One定義ルールなどの一部の条件は、そのような関数に対してコンパイラによって緩和されます。
gcc
属性noinline
とがありますalways_inline
。
この要件は役に立たないと思います。あなたの質問に対する答えは次のとおりです。いいえ。
ただし、マクロを使用することで、その効果を実現できます。
#define f_inline do { int i = 1 + 2; } while( 0 )
void f() {
f_inline;
}
f_inline;
のコードを強制f
的にインラインで適用する場合に使用できるようになりました。
関数呼び出しをインライン化するかどうかは特に問題ではありません。__inline__ の意味を参照してください。. 関数をインライン化せずに記述し、コンパイラーに最適なインライン化の方法を決定させます。
inline
コンパイラがキーワードの使用または不使用を無条件に尊重する場合、または gcc 拡張機能__attribute__((__always_inline__))
とを使用する場合__attribute__(__noinline__))
、単純なラッパー関数で目的を達成できます。
static inline int foo_inline(int a, int b)
{
/* ... */
}
static int foo_noninline(int a, int b)
{
return foo_inline(a, b);
}
私はinline
キーワードでそれを書きましたが、コンパイラは通常それを単なるヒントとして扱うか、無視することさえあるので、おそらく gcc 属性のバージョンが必要です。