c++ - 为什么某些布尔表达式的生成汇编程序包含条件跳转?
问题描述
考虑这段代码:
bool res_true();
bool res_false();
bool test1(const bool cond)
{
return (cond && res_true()) || (!cond && res_false());
}
bool test2(const bool cond)
{
return cond ? res_true() : res_false();
}
两者test1()
和选择基于布尔输入test2()
之间的某个布尔结果。我知道现在的 c++ 编译器可能非常聪明,但我通常倾向于使用这种形式 - 尽管可读性较差 - 因为在我的天真中,我认为在这种情况下只有逻辑布尔运算,没有条件跳转;他们很糟糕,对吧?那么今天我在编译器资源管理器中进行了尝试,发现这两个函数的生成输出非常相似:包含条件跳转(此外,根据编译器和启用的优化,生成的汇编器可能比 的最差),为什么就是它?res_true(),res_false()
cond
test1()
test1()
test1()
test2()
解决方案
这是因为默认的 c++ 布尔运算符||
和&&
是短路的(保证从左到右的评估),所以一个逻辑表达式可能会或可能不会根据他的子表达式的结果被完全评估。例如在:
f() || g()
f()
将首先被调用,如果是g()
则不会被调用;同样在:f()
true
f() && g()
g()
不会调用 if f()
was false
,因此生成的汇编程序必须包含条件跳转以确保使表达式短路。
推荐阅读
- python - 如何使用 PyQt5 登录需要扫描二维码的网页?
- makefile - 当第二个不在第一个目录中时,包含第三个生成文件,其路径相对于第二个
- hyperledger-fabric - Hyperledger Fabric:向对等方发送提案时超时
- authentication - 服务器如何验证基于会话的 cookie 是真实的?
- sql - 如何使用内部连接更新行
- c - 为什么我的 if 没有捕捉到这个空指针取消引用?
- javascript - 无法选择多选项目。jQuery
- reactjs - 我如何测试函数(getPermissions)并在未涵盖分支和语句的情况下做出反应
- mongodb-query - 模糊的 mongoDB 查询,匹配所有内容
- python - 如何使用 selenium 获取从 python 上的 facebook 联系人收到的最新消息?