ここでは、デバッグと最適化を制御するさまざまなコマンドライン・オプションの関係について説明します。
-g (Linux* および Mac OS* X) または /debug:full (Windows*) を使用してデバッグを有効にすると、最適化が無効になります。この場合、コマンドラインで、最適化のコンパイラー・オプションを明示的に指定することで、最適化を有効にできます。
次の表は、一般的なデバッグオプションと最適化オプションをまとめたものです。
コマンドラインで、オブジェクト・ファイルにシンボリック・デバッグ情報を生成する -g (Linux および Mac OS X) または /debug:full (Windows) とともに、最適化オプション O1、O2、または O3 を指定すると、シンボリック・デバッグ対応のコードを生成します。
-g オプションまたは /debug:full オプションとともに O1、O2、または O3 オプションを指定すると、最適化の影響でデバッグ情報の一部が不正確になることがあります。Linux および Mac OS X でこの問題を回避するには、-debug extended オプションも指定します。
最適化とデバッグは明示的に選択するようにしてください。
最適化レベルを指定しない場合、-g オプションまたは /debug:full オプションは、速度を低下させる -O0 または /Od を設定するため、プログラムの実行速度を低下させます。ただし、-O2 (Linux および Mac OS X) または /O2 (Windows) と、-g (Linux および Mac OS X) または /debug:full (Windows) の両方を指定すると、速度はそれほど低下しません。
次の表は、-g オプションまたは /debug:full オプションと、最適化オプションを組み合わせて使用した場合の効果を説明したものです。
オプション |
結果 |
---|---|
-g (Linux および Mac OS X) または /debug:full (Windows) |
デバッグ情報が生成され、-O0 または /Od が有効になります (最適化が無効になります)。Linux および Mac OS X システムでは、IA-32 アーキテクチャーを対象にコンパイルする場合は、-fp が有効になります。 |
-g -O1 (Linux および Mac OS X) または /debug:full /O1 (Windows) |
デバッグ情報が生成され、O1 による最適化が有効になります。 |
-g -O2 (Linux および Mac OS X) または /debug:full /O2 (Windows) |
デバッグ情報が生成され、O2 による最適化が有効になります。 |
-g -O2 (Linux および Mac OS X) または /debug:full /O2 /Oy- (Windows) |
デバッグ情報が生成され、O2 による最適化が有効になります。IA-32 アーキテクチャー・ベースの Windows システムでは、/Oy が無効になります。 |
-g -O3 -fp (Linux および Mac OS X) または /debug:full /O3 (Windows) |
デバッグ情報が生成され、O3 による最適化が有効になります。Linux システムでは、IA-32 アーキテクチャーを対象にコンパイルする場合は、-fp が有効になります。 |
最適化されたプログラムで debug extended を使用しても、最適化処理中にコードが移動または削除されるため、すべての変数を確認したり、すべての行にブレークポイントを設定することはできません。