首页 > 解决方案 > b&&0可以优化吗

问题描述

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

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

但我不知道是否b && 0可以通过编译器进行优化?编译器可以说:好吧,求值0比求值容易得多b,而且b没有任何副作用,所以我决定先b && 0改成0 && b求值0

标签: c++ccompiler-optimizationboolean-expression

解决方案


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

bool f(int);

int main()
{
  if (f(1) && 0)
    return 1;
}

启用优化后,很可能不会为分支生成机器代码。但是,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;
}

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


推荐阅读