我正在使用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);
时包含垃圾。为了解决这个问题,我在变量声明中添加了=0
和=10000
。这有效,但为什么有必要呢?我猜测编译器正在进行某种优化,它避免了代码中的常量赋值,但它也忘记了(?)实际为timeStart
和timeEnd
分配值(除非我初始化)他们在声明中如上所述。)
是什么给出了?
答案 0 :(得分:1)
编译器优化可以做各种事情来引起这种行为,例如将局部变量存储在寄存器中或将单次使用变量转换为常量。如果你想了解发生了什么,一种方法是在调试器中使用汇编视图/模式来查看函数调用SetTime
之前和之后发生的事情。