首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器在不设置变量的情况下对常量的分配

编译器在不设置变量的情况下对常量的分配
EN

Stack Overflow用户
提问于 2012-05-29 22:52:20
回答 1查看 83关注 0票数 0

我正在使用VC++ 2010快车。我写了以下例程:

代码语言:javascript
复制
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 (除非我在声明语句中初始化它们,如上面所示)。

怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-30 02:42:09

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10807856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档