21

私は読んでいます:
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

最初に、このオプションの使用
と組み合わせて( ) を使用しないでください。代わりに、リンカー プラグインに依存することで、より安全で正確な情報が提供されるはずです。-flto-fwhole-program


プログラムがシンボルをエクスポートする必要がない場合は、組み合わせ-fltoて、手続き間のオプティマイザがより積極的な仮定を使用できるようにすることができ-fwhole-programます。これにより、最適化の機会が改善される可能性があります。-fwhole-programリンカー プラグインがアクティブな場合は、 を使用する必要はありません (「 」を参照-fuse-linker-plugin)。

理論的には、 with を使用-fuse-linker-pluginすると常にwithを使用-fltoするよりも最適化された実行可能ファイルが得られるということですか?-fwhole-program-flto

と を別々ldにリンクするために使用しようとしましたが、少なくとも実行可能ファイルのサイズが異なります。-fuse-linker-plugin-fwhole-program

PS私はCentOS 6でgcc 4.6.2とld 2.21.53.0.1を使用しています。

4

1 に答える 1

9

更新: 以下の @PeterCordes コメントを参照してください。基本的に、-fuse-linker-pluginは不要になりました。

これらの違いは微妙です。まず、-fltoが実際に何をするかを理解します。基本的に、後で(「リンク時」に)最適化できる出力を作成します。

-fwhole -programが行うことは、実際にそうであるかどうかにかかわらず、「現在のコンパイル単位がコンパイル中のプログラム全体を表している」と想定することです。したがって、GCC は、特定の関数を呼び出すすべての場所を認識していると想定します。それが言うように、より積極的な手続き間オプティマイザを使用する可能性があります。それについて少し説明します。

最後に、-fuse-linker-pluginが実際に行うことは、各コンパイル単位が実行されるときに通常行われる最適化をリンク時に実行することです。したがって、これは -flto とペアになるように設計されています。なぜなら、-fltoは後で最適化を行うために十分な情報を保存することを意味し、-fuse-linker-pluginは実際にそれらの最適化を行うことを意味するからです。

では、どこが違うのでしょうか。まあ、GCC doc が示唆しているように、-fwhole-programを使用することには原則として利点はありません。それを打破するには、1 つの .cpp ファイルで関数を定義し、それを別のファイルで使用します。リンカー エラーが発生します。

-fwhole-programに利点はありますか? コンパイル ユニットが 1 つしかない場合は、それを使用できますが、正直なところ、それ以上のものはありません。同等のプログラムを使用してさまざまなサイズの実行可能ファイルを取得できましたが、実際に生成されたマシン コードを確認すると、それらは同一でした。実際、私が見た唯一の違いは、デバッグ情報の行番号が異なることでした。

于 2017-02-09T06:54:20.950 に答える