c++ - b&&0可以优化吗
问题描述
我知道 C/C++ 使用短路评估来评估布尔表达式。例如,C/C++ 肯定会计算表达式中操作数a
之前的操作数,如果为 false,则不会计算。b
a && b
a
b
此外,我知道5==6
编译器可能会完全忽略类似的东西,因为它是一个常量表达式,可以在编译时进行评估。
但我不知道是否b && 0
可以通过编译器进行优化?编译器可以说:好吧,求值0
比求值容易得多b
,而且b
没有任何副作用,所以我决定先b && 0
改成0 && b
求值0
。
解决方案
您的问题涉及两个独立的问题。第一个是当编译器“看到”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;
}
推荐阅读
- java - Java 列表
来自 JPA 查询 - awk - awk - 从文件中查找数字
- bash - 将文件名添加为 .txt 文件中的列并连接到单个文件中
- javascript - 为 livereload 编译 gulpfile 时出错
- python - ValueError:所有参数的形状
- javascript - 我的网页似乎可以在某些平台上运行,而不能在其他平台上运行,css 没有得到应用,这是为什么呢?
- c# - 将 AbsoluteLayout 用于背景图像,但某些元素未正确定位 Xamarin Forms
- angular - Angular6 - GET net::ERR_CONNECTION_REFUSED 的 HttpClient 错误处理
- unity3d - 如何在 Unity 项目之间共享新的 SteamVR 动作集和绑定
- debugging - 为什么tomcat在使用类似于“something.com-xyz”的url时返回“400 Bad Request”