1

私のプログラムの一部に、次のコードがあります。

    if(cameraName == L"AVT Prosilica GT2750") {
        mCamera = new camera_avtcam_ex_t();
    } else if(cameraName == L"QImaging Retiga 2000R\\4000R") {
        mCamera = new camera_qcam_ex_t();
    }

cameraName のデフォルトが L"AVT Prosilica GT2750" になるようにプログラムをセットアップすると (デバッガーはこれをその値として表示します)、if ステートメントに入ってmCamera = new camera_avtcam_ex_t();実行しますが、次に実行される行に進むと、私のデバッガーはその行に直接スキップしてmCamera = new camera_qcam_ex_t();実行します。if/else ステートメントの性質を考えると、これはどのように発生する可能性がありますか?

注: else if を単純な else ステートメントに置き換えると、同じ動作が見られます。

4

1 に答える 1

3

これは、リリース ビルドをデバッグしようとしたために発生しています

「デバッグ」ビルドをデバッグしてみてください。期待どおりの動作が表示されるはずです。最適化されたビルドをデバッグする場合、行は必ずしもソース コードと「整列」するとは限りません。ご存じのとおり、オプティマイザーは、両方を実行し、不要な場合は 1 つを破棄するのが最善であると判断しました。

注 - オプティマイザがそれを実行したと示唆しているわけではありません。可能であり、実際に次に実行される行が表示される可能性があると言っているだけです。オプティマイザーは、コードの並べ替え、ループのアンロール、定数の伝播、変数の削除、一時変数の追加などを自由に実行できます。

編集 - 追加の考察
ハードウェア レベルに到達すると、物事は実際に並べ替えられます。ハードウェアは、分岐の両側を実行することを選択してから、必要なときにすぐに答えを準備できるようにする必要があります。実行が高速になる可能性があるため、他の作業を捨てることを意味しますが、それを行います。

于 2013-04-30T17:41:13.740 に答える