質問が正しく述べられていないと思います。質問は文字通り、コンパイラが使用されていない関数を最適化するかどうかを尋ねますが、それはリンカだけが実行できることです。
では、コンパイラは何ができるのでしょうか?コンパイラはデッドコードを最適化できるため、たとえば上記のコードでは、であることa
がわかっているため、コンパイラはステートメントを完全に0
削除できます。if
ほとんどの場合、これで十分です(関数が実行可能ファイルに到達するかどうかに関係なく、分岐が回避されるかどうかに関係なく、特に分岐の予測ミスがある場合は、関数のパフォーマンスに影響します)。
さらに、コンパイラが上記のブランチを最適化すると、プログラム内の関数への参照が1つ少なくなりexampleFunc
、リンカーが生成されたバイナリを処理するときに、プログラム全体に関数への参照がない場合、シンボルを削除できます。完全に。これはプログラムリンケージの一部としてのみ実行できることに注意してください。ライブラリの場合、関数が現在呼び出されていなくても、後でライブラリにリンクされたプログラムがそれを使用する可能性があります。
したがって、元の質問に戻ると、コンパイラーはブランチを最適化し、リンカーはバイナリーから関数を削除する場合としない場合がありますが、それはそれほど重要ではありません。
他のコンストラクトに関しては、forstruct
とclass
、がバイナリに到達するのはメンバー関数だけであり、同じことが当てはまります。プログラムをリンクしていて、どの関数も使用されていない場合、リンカはシンボルをドロップできます。