为什么此if / else语句似乎已被优化?

时间:2019-03-07 18:56:48

标签: c++ visual-studio-2017 compiler-optimization

这是有问题的代码:

    void DeckTug::StickCallback(unsigned long long evtID, DWORD value)
{
    long int val = value;


    if (evtID == stickXInputID || evtID == stickAxisXInputID)
        stickXpct = (((double)val)) / 325.94;
    else if (evtID == stickYInputID || evtID == stickAxisYInputID) {
        stickYpct = (((double)val)) / 325.94;
        if(isAuto)
        if ((stickYpct < 0.0)) {
            acPullingTug = true;
            tugTBoffset = tugReversed ? towbarAttachAft * (-1.0) : towbarAttachForward;
        }
        else {
            acPullingTug = false;
            tugTBoffset = tugReversed ? towbarAttachAft * (-1.0) : towbarAttachForward;
        }
    }
}

当我编译调试版本时,它运行完美。当我编译发行版时,它不起作用。当我将Visual Studio调试器附加到发行版时,我可以在第一个if语句和函数的右括号处中断,但是我无法在其他任何地方遇到断点,而且stickXpct或stickYpct都没有被分配任何东西,尽管在调试器中我可以看到“值”具有有效值,并且“ evtID”确实等于输入ID之一。 总之,在我看来,仅在代码的发行版中,即使其中一个应评估为true,第一个“ if”陈述式和第一个“ else if”陈述式也仅评估为false。有人知道这是怎么回事吗?因为我没有。

非常感谢, 法利

1 个答案:

答案 0 :(得分:0)

编辑:更改答案以回应评论

尝试增加波动率

void DeckTug::StickCallback(unsigned long long evtID, DWORD value)
{
    long int val = value;
    volatile unsigned long long _evtID = evtID;


    if (_evtID == stickXInputID || _evtID == stickAxisXInputID)
        stickXpct = (((double)val)) / 325.94;
    else if (_evtID == stickYInputID || _evtID == stickAxisYInputID) {
        stickYpct = (((double)val)) / 325.94;
        if(isAuto)
            if ((stickYpct < 0.0)) {
                acPullingTug = true;
                tugTBoffset = tugReversed ? towbarAttachAft * (-1.0) : towbarAttachForward;
            }
            else {
                acPullingTug = false;
                tugTBoffset = tugReversed ? towbarAttachAft * (-1.0) : towbarAttachForward;
            }
    }
}

这应该阻止编译器优化那些分支,直到您找到为什么想要优化那些分支为止。