23

(これは gcc と clang に関する質問ですが、他のコンパイラにも当てはまるかもしれません。)

C または C++ コードをコンパイルし、-gスイッチを使用してデバッグ情報を生成すると、コンパイルされたプログラムのパフォーマンスが何らかの形で低下します...

  1. 最小限の最適化で ( -O0)?
  2. 最大最適化 ( -O3)?

注:実行可能ファイルを解析/ロードする必要があることによるパフォーマンスの低下を意味するものではありません。実行可能ファイルは余分なコンテンツのために大きくなります。実行されるコードを意味します。

4

3 に答える 3

19

性能差はないと思います。実際、生成されたコードは同じであり、こちらのドキュメントに従って-g使用できます。また、デバッグ シンボルはコードに書き込まれるのではなく、「デバッグ セクション」と呼ばれる別のセクションに書き込まれます。このセクションは、実行時に (デバッガーによってのみ) 読み込まれることさえありません。-O

-g実行される最適化や生成されるコードは変更されません。ここに記載されているように、これはgccポリシーです

ただし、同じドキュメントに次のように記載されていることに注意してください。

最適化されたコードが取ったショートカットは時として驚くべきものかもしれません: 宣言したいくつかの変数はまったく存在しないかもしれません。制御フローは、予期しない場所に一時的に移動する可能性があります。一部のステートメントは、一定の結果を計算するか、その値が既に手元にあるために実行されない場合があります。一部のステートメントは、ループの外に移動されているため、別の場所で実行される場合があります。それでも、最適化された出力をデバッグすることは可能です。これにより、バグがある可能性のあるプログラムに対してオプティマイザーを使用することが合理的になります。

したがって、最終的にはデバッグによって最適化が損なわれることはありませんが、逆は誤りであり、使用-O3するとデバッグ情報が低下する可能性があります (たとえば、役に立たない変数を削除することによって)。

その場合は、次のように使用する方がよい場合があることに注意してください-Og(ここで説明されているように)。

デバッグ エクスペリエンスを最適化します。-Og は、デバッグを妨げない最適化を有効にします。これは、標準の編集 - コンパイル - デバッグ サイクルに最適な最適化レベルである必要があり、高速なコンパイルと優れたデバッグ エクスペリエンスを維持しながら、適切なレベルの最適化を提供します。

ただし、これはパフォーマンスに影響を与えます。これは、デバッグに干渉する一部の最適化パスが実行されないためです。


編集:

リンクと引用符は、 に関する質問に答えますgcc。. clangただし、 のドキュメントもいくつか見つけましたclang。たとえば、ここに

基本的に、デバッグ情報を使用すると、「-O0 -g」を使用してプログラムをコンパイルし、完全なデバッグ情報を取得して、デバッガーから実行するときにプログラムを任意に変更できます。「-O3 -g」を使用してプログラムをコンパイルすると、常に利用可能で正確な読み取り用の完全なデバッグ情報が得られます (たとえば、テール コールの削除とインライン化にもかかわらず、正確なスタック トレースが得られます)。プログラムから最適化された関数、または完全にインライン化された関数を呼び出します。

于 2016-08-30T09:09:42.017 に答える
4

-g フラグは、バイナリにデバッグ情報を追加します。これは、 CPU ラン ビットとは別の実行可能ファイルのセクション (.stabおよび.stabstr) に存在します。.textデバッガーの外部で実行すると、デバッグ セクションはオペレーティング システム ローダーによって読み込まれません。ユーティリティを使用してデバッグ情報を簡単に削除してstrip、-g フラグなしでコンパイルしたものと同じバイナリを生成することもできます。

ただし、通常、デバッグしたい場合は、最適化と NDEBUG プリプロセッサ マクロを使用せずにコンパイルします。ただし、これらは -g フラグでは制御されません。

于 2016-08-30T09:25:07.903 に答える