レガシーコードに関数がありますが、これはもう呼び出されていません。
私の質問は、コンパイラが呼び出されていない関数を最適化するのか、それとも実行可能ファイルにその関数のコードが含まれるのかということです。
レガシーコードに関数がありますが、これはもう呼び出されていません。
私の質問は、コンパイラが呼び出されていない関数を最適化するのか、それとも実行可能ファイルにその関数のコードが含まれるのかということです。
おそらく。これは、実装、ツールセット、およびビルド パラメータ定義です。
最適化設定、リンカー フラグ、および可視性 (静的/プライベート/外部/内部/匿名名前空間) を変更すると、最終的な実行可能ファイルから省略される可能性が高くなります。
通常、デッド コードの削除はリンカによって行われます (コンパイラは、どの関数が使用されているかどうかの手がかりを持っていないため)。ただし、コンパイラ自体がstatic
リンケージを持つ関数を削除できる場合があります。
これは、デフォルトですべての関数に外部リンケージがあるためです。外部リンケージ変数を宣言する際に使用される予約語「extern」は、関数を宣言する際に省略することができます (実際にはそうです)。したがって、それらが静的であると宣言されていない場合、それらは他の場所で使用でき、コンパイラーはそれについて何も知りません。
また、GCC (それを使用している場合) には、不要なコードの削除に役立つ SSA Aggressive Dead Code Elimination (-fssa-dce フラグ) があります。
デッド関数またはセクションを削除するものを探している場合は、gcov http://gcc.gnu.org/onlinedocs/gcc/Gcov-Intro.html#Gcov-Introを使用できます。
動的な方法で実行時にアクセスできる可能性があるため、ファイル内にある可能性は十分にあります。多数の異なる関数名を生成し、それらにアクセスするために使用される連結された文字列など。
このタイプの実装はめったにありませんが、まだ可能性があるため、コードを引き続き使用できるようにする必要があります。
オブジェクトファイルにコンパイルされている場合、コンパイラは関数が使用されるかどうかを知りません。リンク時の最適化 (lto) またはプログラム全体の最適化オプションを使用していない場合。関数がヘッダーにある場合 - 静的にすることができるので、コンパイラはそれを最適化できます。