我正在使用VC++ 2010快车。我写了以下例程:
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 (除非我在声明语句中初始化它们,如上面所示)。
怎么回事?
发布于 2012-05-30 02:42:09
编译器优化可以做各种事情来导致这种行为,例如将局部变量存储在寄存器中,或者将单个使用的变量转换为常量。如果您想了解正在发生的事情,一种方法是在调试器中使用程序集视图/模式来查看函数调用SetTime之前和之后发生了什么。
https://stackoverflow.com/questions/10807856
复制相似问题