ウィキペディアのインライン関数の問題: http://en.wikipedia.org/wiki/Inline_expansion#Problems
それは次のように述べています。
誰かがこの点を詳しく説明できますか?
GCC が C++ 関数をインライン展開しないようにするにはどうすればよいですか?
ウィキペディアのインライン関数の問題: http://en.wikipedia.org/wiki/Inline_expansion#Problems
それは次のように述べています。
誰かがこの点を詳しく説明できますか?
GCC が C++ 関数をインライン展開しないようにするにはどうすればよいですか?
C++ では、inline
キーワードに実際に必要な意味は 1 つだけです。それは、その関数に対して One-Definition Rule が一時停止されていることです (たとえば、関数は複数の翻訳単位で定義でき、コードは引き続き適合します)。
具体的には、inline
キーワードを使用しても、その関数のコードがインラインで生成されるとは限りません。クラス定義内で関数を定義すると、インライン関数になりますが、繰り返しますが、そのコードがインラインで生成されることも保証されません。
逆に、クラス定義の外で定義され、inline
キーワードなしで定義された関数は、そのコードをインラインで生成することができます。唯一の違いは、この場合、関数の複数の定義がコードを不適合にすることです。
肝心なのは、移植可能なコードは、コードがインラインで生成されるかどうかを保証できないということです。ただし、コードを移植できなくてもかまわない場合は、__attribute__(noinline)
.
ただし、ウィキペディアから引用された引用に基づいてこれを行うつもりはありません。ウィキペディアは信頼できる情報源ではありません。仮にそうだったとしても、あなたが引用しているのは、仮説的な条件下で、仮説的なコンパイラーで仮説的な言語を使用するとどうなるかについての漠然とした声明にすぎません。一般的には、コードを明確で読みやすいように記述し、それから良い結果が生成されるかどうかコンパイラーに心配させたほうがよいでしょう。
inline キーワードは、コンパイラへの提案または指示です。ウィキペディアの定義は、この種のキーワードを使用することで、関数でできることを制限することを暗示しているようです。たとえば、インライン関数のアドレスを取得できないと予想する場合があります。C++ コンパイラは、関数がインラインでマークされていても、コードのどこかでその関数のアドレスが取得されている場合でも、その関数はインラインで生成されません。
同様に、関数が仮想の場合は (明らかに) インラインで生成できませんが、それでも多相関数のインライン定義が違法になるわけではありません。
おそらく、私がここに書いたことは、Coffin が雄弁に表現した inline キーワードでコンパイラが何をする必要があるかについての洞察を与えるでしょう。
C/C++ は、関数をインライン化する方法に関して明確に規定されています。したがって、ウィキペディアからの特定のコメントは、これらの言語には適用されません。
C 言語の仕様では、関数呼び出しパラメーターを逆の順序でスタックに渡す必要があると仮定します (編集: スタックは常に下方向に拡張され、引数の間にパディングは配置されません)。実際には、通常はそうなりますが、それが常に正しいと仮定することはできません。次のコードは、この奇妙な世界で有効です。
void foo( int i, int j )
{
int myi = &j[1];
return myi + j;
}
j の上のスタックで発生する整数をインライン化した場合、foo は i ではない可能性があります。