C ++ if语句重新排序

时间:2014-04-12 14:27:02

标签: c++ gcc optimization if-statement

在我的C ++中(假设这是gcc)我执行以下操作:

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

编译器会像那样优化它:

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

2 个答案:

答案 0 :(得分:2)

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

原因是您有三种操作可以执行:

  • 一个评估,可变或否定变量
  • 否定
  • 或/与

订单可能不同,但必须执行这些要点。我不知道任何可以优化另一个的指令集。

正如评论中所写,编译器甚至可以优化变量,如果它们具有常量值,您使用gcc的哪些优化选项,哪个版本的gcc,哪种架构,不同的平台等等。

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

gcc -S main.cpp

答案 1 :(得分:2)

没有。评估此表达式时:

if (!(prevCurve && curveInside == prevCurveIn)){

该标准要求在评估表达式的其余部分之前对prevCurve进行全面评估,包括任何副作用。运营商'&&'介绍一个序列点。在等效的情况下:

if (!prevCurve || curveInside != prevCurveIn){

运算符||也引入了序列点。

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