Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个if/else语句似乎被优化掉了?_C++_Visual Studio 2017_Compiler Optimization - Fatal编程技术网

C++ 为什么这个if/else语句似乎被优化掉了?

C++ 为什么这个if/else语句似乎被优化掉了?,c++,visual-studio-2017,compiler-optimization,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 == stickYInpu

以下是相关代码:

    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;
        }
    }
}
void DeckTug::StickCallback(无符号长evtID,DWORD值)
{
长int val=值;
如果(evtID==stickXInputID | | evtID==stickXInputID)
stickXpct=((双)val))/325.94;
else if(evtID==stickYInputID | | evtID==StickaxisInPutId){
粘性系数=((双)val))/325.94;
如果(isAuto)
如果((粘性系数<0.0)){
acPullingTug=true;
拖船偏移=拖船反向?拖船前进*(-1.0):拖船前进;
}
否则{
acPullingTug=false;
拖船偏移=拖船反向?拖船前进*(-1.0):拖船前进;
}
}
}
当我编译调试版本时,它运行得非常好。当我编译发布版本时,它不起作用。当我将visual studio调试器附加到发布版本时,我可以在第一个if语句和函数的右大括号上断开,但我不能在其他任何地方找到断点,并且stickXpct或stickYpct都没有被分配任何内容,尽管在调试器中我可以看到“value”有一个有效值,而“evtID”等于一个输入。 总之,在我看来,仅在代码的发布版本中,第一个“if”语句和第一个“elseif”语句的计算结果都是false,即使其中一个语句的计算结果应该是true。有人知道这里发生了什么吗?因为我没有

非常感谢,
法利编辑:根据评论更改答案

尝试增加波动性

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;
            }
    }
}
void DeckTug::StickCallback(无符号长evtID,DWORD值)
{
长int val=值;
易失性无符号长-长_evtID=evtID;
如果(_evtID==stickXInputID | | evtID==stickXInputID)
stickXpct=((双)val))/325.94;
else if(_evtID==stickYInputID | | | u evtID==Stickaxisinputid){
粘性系数=((双)val))/325.94;
如果(isAuto)
如果((粘性系数<0.0)){
acPullingTug=true;
拖船偏移=拖船反向?拖船前进*(-1.0):拖船前进;
}
否则{
acPullingTug=false;
拖船偏移=拖船反向?拖船前进*(-1.0):拖船前进;
}
}
}

这将阻止编译器优化这些分支,直到您能够找到它想要优化这些分支的原因。

您的野生类型转换有点可疑,我一点也不确定,但其中一个类型转换导致的UB可能是一个原因
long int val=*reinterpret\u cast(&value)调用未定义的行为您需要提供一个。实际上,代码引用的变量(类成员)可以是任何东西——更重要的是,它们的类型和值可能与您看到的效果相关。不过,重新解释演员阵容的想法非常可疑。所有其他类型转换的需要都是潜在的危险信号。我敢打赌,在某些地方有一些未定义或未指定的行为——在这种情况下,编译器可以做一些奇怪的事情。没有足够的代码给出结论性的答案,但它看起来像是UB。可以是你自由的演员阵容,也可以是其他的。顺便说一下,
long int val=*reinterpret_cast(&value)
完全没有必要-
long int val=value
将是完美的。我想尝试一下,但我不能使用switch语句,因为stickXInputID等不是常量,它们是静态成员变量(DWORD类型)。因此,我不能将它们用作开关案例。然后,我们回到这样一个有限的示例中,几乎不可能确定原因。@lequinne如果它们是在类定义中初始化的静态常量DWORD成员变量,则它们是常量,可用于案例标签。@Oktalist它们不是常量,在类构造期间,它们从其他地方返回到此类。我目前正在开发一个MCVE,但不确定我是否能做到,因为这个函数的调用代码实际上相当复杂。。。此函数实际上是绑定到此类实例的std::function对象,存储在另一个对象的向量中,并由该对象调用。我正在尝试制作一个最小/可复制的示例,但到目前为止,我没有尝试复制这个问题,这并不奇怪,因为我已经使用这个模型多年了,没有任何问题。另外,为了可维护性,请将代码放在
if(isAuto)
之后{}