2016-11-17 17 views
0

ヘッダーのみとヘッダー&のソースデザインの間で検討しています。ヘッダー&ソースでコンパイラがオブジェクトファイルとリンケージ間で最適化できるかどうかわかりませんか?インライン最適化など?Cコンパイラはオブジェクトファイル全体を最適化できますか?

+1

コンパイラでは、1つの翻訳単位しか表示されません。そうではありません。しかし、リンカーはできます。 LTOについて読む。それが何であれ:時期尚早の最適化をしないでください!保守可能なコードを書いて、定義をヘッダに入れないでください(短い関数のみであるべき 'inline'関数を除く)。 – Olaf

答えて

3

ヘッダーファイルとソースファイルは、通常、ヘッダーがソースファイルに含まれているため、単一の翻訳単位としてコンパイルされます。したがって、それは問題ではありません( ヘッダーが別々にコンパイルされている独特の環境がない限り)。

GCCは、さまざまな翻訳単位にわたって最適化をサポートしています。 Link Time Optimizationを参照してください。

詳細については-fltoオプションのマニュアルを参照してください:-flto

[= n]は

このオプションは、標準のリンク時の最適化プログラムを実行します。 ソースコードで呼び出されると、GIMPLE(GCCの内部の 表現の1つ)が生成され、オブジェクト ファイル内の特別なELFセクションに書き込まれます。オブジェクトファイルがリンクされると、すべての関数 の本文がこれらのELFセクションから読み込まれ、 が同じ翻訳単位の一部であるかのようにインスタンス化されます。リンク時間 オプティマイザを使用するには、コンパイル時および最終リンク時に、-fltoおよび最適化オプションを指定する必要があります( )。 同じリンクに参加するすべてのファイルを同じ オプションでコンパイルし、リンク時にこれらのオプションも指定することをお勧めします。

+0

*とリンクを* -fltoと*最適化フラグ*でコンパイルするのを忘れないでください。典型的に 'make CC = 'gcc -flto -O2'' –

+0

なぜ' -flto'がデフォルトのものではないのですか?これをしない理由はありますか? – w00d

+0

@ w00dデフォルトではほとんどの最適化が有効になっていないのと同じです:1)高価な場合があります.2)デバッグが難しい場合があります。3)時折バグ(オプティマイザでのバグ)などが発生します。それらに受け入れられている前述の理由の1つ以上)。 – usr

関連する問題