3

いくつかの最適化に関する考慮事項:

Intel C ++コンパイラ(ICC 13.0など、原因は/ O3などの最適化オプションでコンパイルされたもの)がexamplefunなどのコード内の未使用/未使用の構造体/クラス/関数/変数を自動的に最適化するかどうかを確実に知っている人はいますか? () 下:

         //...defining examplefunc()....//

         const int a=0;
         if (a>0) 
            int b=examplefunc();
4

2 に答える 2

4

コンパイラは通常、未使用の関数がstatic特定のモジュール内でのみアクセス可能でない限り、それらを最適化することはありません。ただし、リンクがモジュールレベルではなく関数レベルで行われる場合、リンカは関数を完全に削除する可能性があります。

アセンブリ出力やリンカマップobjdumpを確認したり、関数がリンクされたバイナリに含まれているかどうかを確認したりすることができます。

于 2012-11-23T03:28:11.690 に答える
3

質問が正しく述べられていないと思います。質問は文字通り、コンパイラが使用されていない関数を最適化するかどうかを尋ねますが、それはリンカだけが実行できることです。

では、コンパイラは何ができるのでしょうか?コンパイラはデッドコードを最適化できるため、たとえば上記のコードでは、であることaがわかっているため、コンパイラはステートメントを完全に0削除できます。ifほとんどの場合、これで十分です(関数が実行可能ファイルに到達するかどうかに関係なく、分岐が回避されるかどうかに関係なく、特に分岐の予測ミスがある場合は、関数のパフォーマンスに影響します)。

さらに、コンパイラが上記のブランチを最適化すると、プログラム内の関数への参照が1つ少なくなりexampleFunc、リンカーが生成されたバイナリを処理するときに、プログラム全体に関数への参照がない場合、シンボルを削除できます。完全に。これはプログラムリンケージの一部としてのみ実行できることに注意してください。ライブラリの場合、関数が現在呼び出されていなくても、後でライブラリにリンクされたプログラムがそれを使用する可能性があります。

したがって、元の質問に戻ると、コンパイラーはブランチを最適化し、リンカーはバイナリーから関数を削除する場合としない場合がありますが、それはそれほど重要ではありません。

他のコンストラクトに関しては、forstructclass、がバイナリに到達するのはメンバー関数だけであり、同じことが当てはまります。プログラムをリンクしていて、どの関数も使用されていない場合、リンカはシンボルをドロップできます。

于 2012-11-23T04:36:19.657 に答える