0

VC++ 2010 Express を使用しています。私は次のルーチンを書きました:

HRESULT DLTimeStampNow::Receive(IMediaSample *pSample)
{
    long long fnum, fnum2;
    REFERENCE_TIME timeStart=0, timeEnd=10000;

    // make this sample available for the next worker-thread call to Transform()

    pSample->AddRef();

    CRefTime rtStream;

    timeStart = 0;
    timeEnd = 10000;

    pSample->SetTime(&timeStart, &timeEnd);

    EnterCriticalSection(&cs);

    if (pSampleWaiting != NULL)
        ((IMediaSample*)pSampleWaiting)->Release();

    pSampleWaiting = pSample;

    SetEvent(hSampleIsReady);

    LeaveCriticalSection(&cs);

    return S_OK;
}

これは進行中の作業の一部です。そのため、fnum や rtStream などの変数は存在しますが、使用されていません。

実行時に、VC++ デバッガーはtimeStart = 0またはtimeEnd = 10000にブレークポイントを配置することを拒否します。デバッガーは、実行が に達した時点でゴミが含まれていることを示しますpSample->SetTime(&timeStart, &timeEnd);。これに対処するために、変数宣言に=0andを追加しました。=10000これは機能しますが、なぜ必要なのですか?コンパイラは、コード内の定数の割り当てを回避する何らかの最適化を行っていると推測していますが、実際にtimeStartandに値を割り当てることを忘れています(?) timeEnd(上記のように、宣言ステートメントでそれらを初期化しない限り)。

何を与える?

4

1 に答える 1

1

コンパイラの最適化は、ローカル変数をレジスタに格納したり、シングルユース変数を定数に変換したりするなど、この動作を引き起こすさまざまなことを行う可能性があります。何が起こっているのかを理解したい場合、1つのアプローチは、デバッガーでアセンブリビュー/モードを使用して、への関数呼び出しの前後に何が起こるかを確認することSetTimeです。

于 2012-05-30T02:42:09.767 に答える