可以优化 b&&0

Yve*_*ves 3 c c++ boolean-expression compiler-optimization

我知道 C/C++ 使用短路评估来评估布尔表达式。例如,C/C++ 肯定会在表达式中的操作数a之前计算操作数,如果为 false,则不会计算。ba && bab

此外,我知道5==6编译器可能会完全忽略诸如此类的事情,因为它是一个常量表达式,可以在编译时进行评估。

但是不知道b && 0编译器能不能优化?编译器可以说:好吧, 的求值0比 的求值容易得多b,并且b没有任何副作用,所以我决定先更改b && 00 && b求值0

Dan*_*ica 9

你的问题涉及两个独立的问题。第一个是当编译器“看到”if条件总是false(由于&& 0)时,它可以完全丢弃相应的分支。示例翻译单元:

bool f(int);

int main()
{
  if (f(1) && 0)
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

启用优化后,很可能不会为分支生成机器代码。但是,f(1)表达式仍必须在运行时求值,因为编译器无法证明f(1)调用没有可观察的行为。

机器码:https : //godbolt.org/z/sEMrfh

相反,如果编译器可以证明f(1)没有可观察到的行为,它可以消除它的调用。这与求值顺序无关,而是与as-if规则有关。演示翻译单元:

static bool f(int i)
{
  int j = i + 1;
  return true;
}

int main()
{
  if (f(1) && 0)
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

机器码:https : //godbolt.org/z/scs3je