2013-04-03 8 views
5

プログラミング時に、関数、定義、変数、マクロのインクルードとデータ構造を定義または宣言します。それ以降は使用しないでください。コンパイラは、未使用の関数、定義、変数、マクロ、インクルードなどを削除します。

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

GCCは常に '-Wall'で未使用の変数警告をスローします。 – Blender

+2

マクロは無関係ですが、http://stackoverflow.com/q/6215782/390913を参照してください。 – perreal

答えて

8

依存度:

マクロは、コンパイラによってプログラムテキストに変換されます。それらは を置き換えるテキスト以外のものを表すものではなく、 です。

ローカル変数などは、おそらく除外されないコンストラクタまたはデストラクタである を持っていなければ削除される可能性があります。 (あなたはscoped_lockよう 何かがあなたがちょうどので、削除したくないではない 参照それ以降のコードで。)同じキーワードstaticと名前空間 スコープで定義された内部リンケージのある変数 および機能(例えば成り立ちます)。しかし、ほとんどの場合、そのようなオブジェクトに必要なリソースは で最小限に抑えられ、節約額はごくわずかです。

機能は少し異なり、依存します。仮想ファンクション は、そのタイプのインスタンス が存在する場合には一般に「使用」とみなされ、 が呼び出されなくてもほぼ確実に存在します。

以上(これはグローバル変数にも適用されます):リンカまでは です。ほとんどのリンカーの細かさは、オブジェクト " "の翻訳単位をコンパイルした結果です。つまり、 オブジェクトファイルがプログラムの一部であるか、またはその一部ではありません。 オブジェクトファイルを組み込むようにリンカーに指示する場合は、 にあるすべてのものを取得する必要があります。オブジェクトファイルを (静的)ライブラリに入れ、これを使用するようにリンカに指示した場合、 リンカは、オブジェクトファイルをプログラムに組み込みます。 は、未解決の外部ファイルを解決する場合のみです。しかし、 にオブジェクトファイルが組み込まれている場合は、一般にすべて が組み込まれます。 (良いライブラリーは、それぞれの非仮想関数を に別々のオブジェクトファイルに入れるため、必要以上に多くのものを取得することはありません。)

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

最後に、プログラムの一部ではありませんが、オブジェクトファイルと 最終実行ファイルには記号情報が含まれることがよくあります。 ベストシステムでは、 マクロに関する情報も保持されるため、デバッガでは の書き込み方法を表示できます。 (マクロでこれを行うことができるのは議論の余地があります。)

4

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

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

しかし、プログラムのアセンブリ部分に実装されている未使用のコードとデータを削除することは難しくなります。

参照されている変数やコードが使用または実行されることが常にあるとは限りません。

そうですね、最近、明らかに未使用のもののほとんどが削除されています。

+1

未使用のものによって異なります。グローバルスコープのもの(そしてほとんどの関数を含む)は、リンカによってのみ削除することができます。ほとんどのリンカの細かさはオブジェクトファイルです。オブジェクトファイルがプログラムに組み込まれるとすぐに、 。通常、削除されるのはローカル変数などです。とにかく多くのリソースを必要としないもの。 –

+0

@JamesKanze私はリンカーについて言及しました。粒度は単一のオブジェクトファイル(翻訳単位)である必要はありません。 –

+1

必ずしもそうである必要はありませんが、ほとんど常にそうです。実際には、経験豊富なプログラマがライブラリコードを構築する際に、各関数を別々のソースファイルに入れてしまう傾向があります。 –