2

レガシーコードに関数がありますが、これはもう呼び出されていません。

私の質問は、コンパイラが呼び出されていない関数を最適化するのか、それとも実行可能ファイルにその関数のコードが含まれるのかということです。

4

4 に答える 4

3

おそらく。これは、実装、ツールセット、およびビルド パラメータ定義です。

最適化設定、リンカー フラグ、および可視性 (静的/プライベート/外部/内部/匿名名前空間) を変更すると、最終的な実行可能ファイルから省略される可能性が高くなります。

于 2012-08-20T07:02:47.747 に答える
0

通常、デッド コードの削除はリンカによって行われます (コンパイラは、どの関数が使用されているかどうかの手がかりを持っていないため)。ただし、コンパイラ自体がstaticリンケージを持つ関数を削除できる場合があります。

これは、デフォルトですべての関数に外部リンケージがあるためです。外部リンケージ変数を宣言する際に使用される予約語「extern」は、関数を宣言する際に省略することができます (実際にはそうです)。したがって、それらが静的であると宣言されていない場合、それらは他の場所で使用でき、コンパイラーはそれについて何も知りません。

また、GCC (それを使用している場合) には、不要なコードの削除に役立つ SSA Aggressive Dead Code Elimination (-fssa-dce フラグ) があります。

デッド関数またはセクションを削除するものを探している場合は、gcov http://gcc.gnu.org/onlinedocs/gcc/Gcov-Intro.html#Gcov-Introを使用できます。

于 2012-08-20T07:04:07.453 に答える
0

動的な方法で実行時にアクセスできる可能性があるため、ファイル内にある可能性は十分にあります。多数の異なる関数名を生成し、それらにアクセスするために使用される連結された文字列など。

このタイプの実装はめったにありませんが、まだ可能性があるため、コードを引き続き使用できるようにする必要があります。

于 2012-08-20T07:08:34.507 に答える
0

オブジェクトファイルにコンパイルされている場合、コンパイラは関数が使用されるかどうかを知りません。リンク時の最適化 (lto) またはプログラム全体の最適化オプションを使用していない場合。関数がヘッダーにある場合 - 静的にすることができるので、コンパイラはそれを最適化できます。

于 2012-08-20T07:04:46.460 に答える