首页 > 解决方案 > 为什么某些布尔表达式的生成汇编程序包含条件跳转?

问题描述

考虑这段代码:

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()condtest1()test1()test1()test2()

标签: c++compilationlogical-operatorsoperator-precedenceboolean-expression

解决方案


这是因为默认的 c++ 布尔运算符||&&是短路的(保证从左到右的评估),所以一个逻辑表达式可能会或可能不会根据他的子表达式的结果被完全评估。例如在:

f() || g()

f()将首先被调用,如果是g()则不会被调用;同样在:f()true

f() && g()

g()不会调用 if f()was false,因此生成的汇编程序必须包含条件跳转以确保使表达式短路。


推荐阅读