C++ C++;if语句重新排序

C++ C++;if语句重新排序,c++,gcc,optimization,if-statement,C++,Gcc,Optimization,If Statement,编译器会这样优化它吗: bool prevCurve; bool curveInside; bool prevCurveIn if (!prevCurve || curveInside != prevCurveIn){ ... } 这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化 原因是您有三个操作要以任意一种方式执行: 一个求值,变量或否定变量 否定 或/及 顺序可能不同,但必须执行这些点。我不知道任何指令集,其中一个可以优化其他 如注释中所述,编译器甚至可以优化

编译器会这样优化它吗:

bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!prevCurve || curveInside != prevCurveIn){
...
}

这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化

原因是您有三个操作要以任意一种方式执行:

  • 一个求值,变量或否定变量
  • 否定
  • 或/及
顺序可能不同,但必须执行这些点。我不知道任何指令集,其中一个可以优化其他

如注释中所述,编译器甚至可以优化变量,如果它们具有常量值、您对gcc使用的优化选项、gcc的哪个版本、哪个体系结构、不同的平台等

最好的方法是比较可以生成的汇编程序输出:

gcc -S main.cpp

这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化

原因是您有三个操作要以任意一种方式执行:

  • 一个求值,变量或否定变量
  • 否定
  • 或/及
顺序可能不同,但必须执行这些点。我不知道任何指令集,其中一个可以优化其他

如注释中所述,编译器甚至可以优化变量,如果它们具有常量值、您对gcc使用的优化选项、gcc的哪个版本、哪个体系结构、不同的平台等

最好的方法是比较可以生成的汇编程序输出:

gcc -S main.cpp

否。计算此表达式时:

if (!(prevCurve && curveInside == prevCurveIn)){
该标准要求在评估表达式剩余部分之前,对
prevCurve
进行全面评估,包括任何副作用。运算符“&&”引入一个序列点。在同等情况下:

if (!prevCurve || curveInside != prevCurveIn){
操作符
|
还引入了序列点


从理论上讲,编译器可能在这两种情况下生成相同的代码,但即使生成了相同的代码,这也不是优化。撇开基于其他考虑因素的优化可能性不谈,每种情况下的代码都将执行一个具有完全相同结果的类似指令序列。本标准要求如此。

否。在计算此表达式时:

if (!(prevCurve && curveInside == prevCurveIn)){
该标准要求在评估表达式剩余部分之前,对
prevCurve
进行全面评估,包括任何副作用。运算符“&&”引入一个序列点。在同等情况下:

if (!prevCurve || curveInside != prevCurveIn){
操作符
|
还引入了序列点


从理论上讲,编译器可能在这两种情况下生成相同的代码,但即使生成了相同的代码,这也不是优化。撇开基于其他考虑因素的优化可能性不谈,每种情况下的代码都将执行一个具有完全相同结果的类似指令序列。标准要求是这样的。

为什么是优化?这取决于编译器、优化设置以及布尔值的获取位置和时间(即,如果其中一个值在当前范围内为常量,它可能会从等式中完全消失)@LaszloPapp:在第一种情况下,必须检查比较的两个部分,在“优化”行中,理想情况下只有一个。@Jongware:你是什么意思?在第二个示例中,如果
prevCurve
false
,则第二部分不需要检查。为什么会是优化?这取决于编译器和优化设置,以及布尔值的获取位置和时间(即,如果其中一个值在您当前的范围内是常数,它可能会从方程中完全消失)。@LaszloPapp:在第一种情况下,必须检查比较的两个部分,在“优化”行中,理想情况下只有一个。@Jongware:你是什么意思?在第二个例子中,如果
prevCurve
false
,则第二部分不需要检查。为了澄清,标准要求在这两种情况下执行
if
后面的语句块,或在两种情况下均未执行;它不要求生成什么汇编代码,也不要求运行多长时间。@MattMcNabb:但它对求值顺序以及是否对右侧的
|
&
求值都有要求。是的,尽管在这个特定的例子中,这种评估没有明显的效果(除非变量是易变的或未初始化的)。我的意思是说,该标准不要求生成类似的指令序列,即使保证这两个表达式具有完全相同的可观察行为,为了澄清,该标准要求如果在这两种情况下执行或不在这两种情况下执行
,则
后面的语句块;它不要求生成什么汇编代码,也不要求运行多长时间。@MattMcNabb:但它对求值顺序以及是否对右侧的
|
&
求值都有要求。是的,尽管在这个特定的例子中,这种评估没有明显的效果(除非变量是易变的或未初始化的)。我的意思是,标准不要求生成类似的指令序列,即使这两个表达式保证具有完全相同的可观察行为