関数fをインラインで宣言していない場合。次のと同じように:翻訳単位とgcc間で自動的にインライン化された関数4.6
ああ:
X f(Y y);
A.cpp:
X f(Y y)
{
...
}
そして、異なる翻訳単位で:
B.cpp:
#include "A.h"
Z g(W w)
{
...
... f(...) ...
...
}
次に、2つの翻訳単位をコンパイルしますA.oとB.oをgcc 4.6で置き換え、それらをgccにもリンクします。 (たぶん、両方のステップで-O3を使用)
gccはリンク時にパフォーマンスのための関数をインライン展開することを検討しますか?それとも遅すぎますか?
コードレビューでは、コンパイラがインライン展開するよりもよくわかるように、私の関数をインラインで宣言すべきではないと提案しました。関数がヘッダに定義されていない限り、コンパイラにはインライン化するオプションがないので、私はいつも印象に残っていました。
(答えはCモード、C++モード、またはGNU ++ 0xのモードのために異なる場合にも、この点を指摘してください)
なぜこのようなことをしたいですか?インラインはそのために発明されたばかりです。これは、 "定義済みの複数のシンボル"エラーを発生させることなく、ヘッダファイルに関数の定義を持たせることができます。そして、今日は十分にうまく機能しています。コンパイラは、関数を効率的にインライン展開するための良い戦略を持っています。 –
@ JensGustedt:なぜですか?怠惰。私はむしろ、オプティマイザが、関数をインライン化するのが最善であるときに、スタック上ではなくレジスタにローカル変数を置くときと同じ方法で計算することを考えます。私はこれが議論の余地がないと思うし、あなたはその要点を見逃してしまった。 –
うん、それはまさに私が言ったことです。コンパイラにあなたのためにそれを行う機会を与えてください。 'inline'はコンパイラに適切なときにそれをするように依頼する以外のことを意味するものではありません。あなたの例にとどまるために、コンパイラがレジスタに保持するか、それを流すことを決定した時点で、ローカル変数が完全に見えます。クリーンなコードを書くと、コンパイラはあなたに素敵です。そして、率直に言って、.cファイルよりもヘッダファイルに関数の定義を持たせるのはなぜ難しいのですか?別の場所でまったく同じテキストですか? –