2012-03-19 10 views
6

関数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のモードのために異なる場合にも、この点を指摘してください)

+0

なぜこのようなことをしたいですか?インラインはそのために発明されたばかりです。これは、 "定義済みの複数のシンボル"エラーを発生させることなく、ヘッダファイルに関数の定義を持たせることができます。そして、今日は十分にうまく機能しています。コンパイラは、関数を効率的にインライン展開するための良い戦略を持っています。 –

+0

@ JensGustedt:なぜですか?怠惰。私はむしろ、オプティマイザが、関数をインライン化するのが最善であるときに、スタック上ではなくレジスタにローカル変数を置くときと同じ方法で計算することを考えます。私はこれが議論の余地がないと思うし、あなたはその要点を見逃してしまった。 –

+0

うん、それはまさに私が言ったことです。コンパイラにあなたのためにそれを行う機会を与えてください。 'inline'はコンパイラに適切なときにそれをするように依頼する以外のことを意味するものではありません。あなたの例にとどまるために、コンパイラがレジスタに保持するか、それを流すことを決定した時点で、ローカル変数が完全に見えます。クリーンなコードを書くと、コンパイラはあなたに素敵です。そして、率直に言って、.cファイルよりもヘッダファイルに関数の定義を持たせるのはなぜ難しいのですか?別の場所でまったく同じテキストですか? –

答えて

12

機能がLink Time Optimization(LTO)と呼ばれ、GCC 4.6ではデフォルトで

が有効化されていません[編集] LTOでは、GCCはA.objX f(Y y)の "GIMPLE" の表現を保存します、有効。この表現は、通常のC++前処理よりもわずかに多く処理されますが、それほど多くはありません。特に、まだアセンブリに変換されていません。その結果、リンカーは引き続きインライン展開できます。

+0

この特定のシナリオでこの機能の仕組みを簡単に説明してください。私はこれの手がかりを持っていませんでした。 –

-1

私はgccが関数がインラインとして別のソースファイルに分割作る作成することができるとは思いません。同じソースファイルに宣言した場合にのみ機能します。

-1

コンパイラは、パフォーマンスを向上させるためにインライン化するかどうかを選択できます。しかし、この場合、コンパイラは無力だと思います。関数fをインライン化することはできません。

注意:キーワードを使用しても、その唯一の提案です。インラインにするかどうかの究極の決定は、コンパイラーまでです。だから、コンパイラに示唆するのに問題はありません。

関連する問題