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 = 0or处放置断点timeEnd = 10000,这很好,只是它也无法初始化它们。调试器显示它们在执行到达时包含垃圾pSample->SetTime(&timeStart, &timeEnd);。为了解决这个问题,我在变量声明中添加了=0和。=10000这行得通,但为什么有必要呢?我猜编译器正在做某种优化,它避免了代码中的常量赋值,但它也忘记了(?)实际上为timeStartand赋值timeEnd(除非我在他们的声明语句中初始化它们,如上所述)。

是什么赋予了?

4

1 回答 1

1

编译器优化可以做各种事情来导致这种行为,例如将局部变量存储在寄存器中或将一次性变量转换为常量。如果您想了解发生了什么,一种方法是在调试器中使用程序集视图/模式来查看函数调用之前和之后发生的情况SetTime

于 2012-05-30T02:42:09.767 回答