4

今日のインタビューで、デバッグビルドとリリースビルドの間で発生する可能性のある4つの違いをリストするように求められました。デバッグ情報などの違いではなく、動作の違いを意味していると思います。私は2つしか名前を付けることができませんでした:

  1. 一部の関数がインライン化されていないため、デバッグビルドは一般的にはるかに遅くなります。
  2. 速度の違いにより、競合状態のあるマルチスレッドプログラムでは、これらの競合状態は2つのビルドのうちの1つでのみ明らかになる可能性があります。

他にどのような違いを挙げられますか?

4

3 に答える 3

7

いくつかの違いの概要を次に示します: http://msdn.microsoft.com/en-us/library/aa236698%28v=vs.60%29.aspx。以下が含まれます。

  • ヒープ レイアウト (デバッグ メモリ アロケータの使用)
  • マクロ (assert ステートメント、および「#ifndef NDEBUG」に含まれるすべてのものを含む) は、場合によっては実質的な違いになる可能性があります。健全性チェックを実行するために使用されます)
  • 最適化 (ほとんどの場合、デバッグ ビルドでは無効になっています)
  • 初期化と不良ポインター: 初期化されていない変数は、割り当てられるまで未定義の状態になります。しかし、デバッグ ビルドでは、既知の状態 (たとえば、すべてゼロまたはすべて #CCCCCCC など) に初期化されることがよくあります。
于 2012-05-21T15:34:24.237 に答える
3

あなたの2つの答えに加えて、ここに別の4つがあります:

  1. _DEBUG 対 NDEBUG
  2. リンカーは、デバッグ時とリリース時に異なるライブラリを使用します
  3. デバッグ ビルドは、デバッグに使用されるシンボルも生成します。
  4. コードが最適化されてしまう可能性があるため、特定の状況では、リリース中に一部のコンストラクターの呼び出しが少なくなり、厄介なバグが発生する可能性があります。例を次に示します。
Object x(3);
Object y;
y = x;

対:

Object x(3);
Object y = x;
于 2012-05-21T15:40:54.530 に答える
1

もう 1 つのポイントは、多くのライブラリでは、デバッグで有効になっている追加のチェックがあることです。これは皮肉なことに、デバッグ ビルドではコードが機能するが、リリース ビルドでは機能しないことを意味する場合があります。

デバッグ ビルドではメモリをゼロにするが、パフォーマンス上の理由からリリース ビルドではゼロにしない割り当て関数を想像してみてください。その後、この変数の値が初期化されずに読み取られた場合、デバッグ ビルドでは適切に定義された (ゼロ) 値が認識されますが、リリース ビルドでは任意の値が認識されます。

逆に、デバッグ ビルド チェックでは、未定義の動作を検出することもできます。たとえば、へのアクセスが[]定義された範囲内にあるかどうかをチェックします。

于 2012-05-21T15:35:17.957 に答える