6

プログラミングでは、関数、定義、変数、マクロ インクルード、データ構造を定義または宣言することがあります。その後は絶対に使用しないでください。

  1. これらの未使用のリソースは、コンパイラ (最適化が可能な最新のコンパイラ) によって自動的に削除されますか?
  2. とにかくそれらを認識することはありますか?
4

2 に答える 2

11

場合によります:

マクロは、コンパイラによってプログラム テキストに変換されます。それらは、それらを置き換えるテキスト以外のものを表すものではなく、コンパイル時を超えて存続しません (以下を参照しない限り)。

ローカル変数などは、重要なコンストラクタまたはデストラクタがない場合、削除される可能性があります。(後でコード内で参照しないという理由だけで、の ようなものを削除する必要はありませ。) 同じことが、内部リンケージを持つ変数および関数にも当てはまります (たとえば、キーワード を使用して名前空間スコープで定義されます)。ただし、ほとんどの場合、そのようなオブジェクトに必要なリソースは最小限であり、節約はごくわずかです。scoped_lockstatic

関数は少し異なり、依存します。仮想関数は、通常、そのタイプのインスタンスが存在する場合に「使用済み」と見なされ、呼び出されなくてもほぼ確実に存在します。

それを超えて(これはグローバル変数にも当てはまります):リンカー次第です。ほとんどのリンカの粒度は、「翻訳単位」をコンパイルした結果のオブジェクト ファイルです。そのオブジェクト ファイルは、プログラムの一部であるか、プログラムの一部ではないかのいずれかです。リンカーにオブジェクト ファイルを組み込むように指示すると、その中にあるすべてのものを取得する必要があります。オブジェクト ファイルを (静的) ライブラリに配置し、リンカーにこれを使用するように指示すると、リンカーは、未解決の外部ファイルを解決する場合にのみ、オブジェクト ファイルをプログラムに組み込みます。ただし、オブジェクト ファイルを組み込む場合は、通常、そのすべてを組み込みます。(優れたライブラリは、非仮想関数をそれぞれ個別のオブジェクト ファイルに配置するため、必要以上に取得することはありません。)

この点で、DLL は (その名前にもかかわらず) オブジェクト ファイルのように動作します。オブジェクト ファイルを DLL にリンクすると、それを使用するプログラムは DLL をすべて取得するか、まったく取得しません。

最後に、プログラムの一部ではありませんが、オブジェクト ファイルと最終的な実行可能ファイルには、シンボリック情報が含まれていることがよくあります。最良のシステムは、マクロに関する情報も保持するため、デバッガーはユーザーが記述した方法で物事を表示できます。(マクロでどこまでできるかは議論の余地があります。)

于 2013-04-03T09:01:00.853 に答える
4

コンパイラまたはリンカーのいずれかが、C 関数または C 変数への参照がないことを確認できる場合、それらの未使用のものを削除できます (通常は削除します)。

未使用のマクロ定義は、コンパイルされたコードにはまったく含まれません。typedef などについても同様です。

ただし、プログラムのアセンブリ部分に実装された未使用のコードやデータを削除することは困難です。

また、参照される変数またはコードが使用または実行されるかどうかは、コンパイラにとって常に明らかではありません。

ええ、最近では、明らかに使用されていないもののほとんどが削除されています。

于 2013-04-03T08:45:16.520 に答える