编译器Elides分配常量而不设置变量

时间:2012-05-29 22:52:21

标签: visual-c++

我正在使用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 = 0timeEnd = 10000,这样就可以了,除非它无法初始化它们。调试器显示它们在执行到达pSample->SetTime(&timeStart, &timeEnd);时包含垃圾。为了解决这个问题,我在变量声明中添加了=0=10000。这有效,但为什么有必要呢?我猜测编译器正在进行某种优化,它避免了代码中的常量赋值,但它也忘记了(?)实际为timeStarttimeEnd分配值(除非我初始化)他们在声明中如上所述。)

是什么给出了?

1 个答案:

答案 0 :(得分:1)

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