[英]C++ Optimizing If Statements
请考虑以下声明:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2) {
a.c3=b.c3;
}
此声明是否会针对以下内容进行优化:
if(a.c1 == b.c1) {
if(a.c2 == b.c2) {
a.c3=b.c3;
}
}
AFAIK,C ++编译器不执行此类操作,因为它可能有副作用。 但这些都是内置类型。
是。 以下代码段:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2)
{
a.c3=b.c3;
}
将被“优化”到这个(或类似的东西):
if(a.c1 == b.c1)
{
if(a.c2 == b.c2)
{
a.c3=b.c3
}
}
这不是因为优化,而是因为C ++标准需要 短路评估 。 因此,合理的符合标准的C ++编译器应该能够使其短路。
C ++标准中没有一个地方明确声明某些布尔运算符是短路的。 这是从规则暗示:
ISO / IEC C ++标准14882§5.14逻辑AND运算符[expr.log.and]
logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression
&&
运算符从左到右分组。 操作数都隐式转换为bool
类型(第4节)。 其结果是true
,如果两个操作数都是true
和false
,否则。 与&
不同,&&
保证从左到右的评估:如果第一个操作数为false
则不评估第二个操作数。
||
的规则类似 运营商:
ISO / IEC C ++标准14882§5.15逻辑OR运算符[expr.log.or]
logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression
||
操作员组从左到右。 操作数都隐式转换为bool
(第4节)。 如果其任一操作数为true
,则返回true
否则返回false
。 与|
不同 ,||
保证从左到右的评估; 此外,如果第一个操作数的计算结果为true
则不计算第二个操作数。
有条件的?
运营商:
ISO / IEC C ++标准14882§5.16条件运算符[expr.cond] conditional-expression:logical-or-expression logical-or-expression? 表达式:赋值表达式
- 条件表达式从右到左分组。 第一个表达式隐式转换为
bool
(第4节)。 它被评估,并且如果它是true
,条件表达式的结果是所述第二表达式的值,否则,所述第三表达的。 除了临时破坏(12.2)之外,第一个表达式的所有副作用都发生在评估第二个或第三个表达之前。 仅评估第二和第三表达式中的一个。
标准5.14 / 1:
&&运算符从左到右分组。 操作数都隐式转换为bool类型(第4节)。 如果两个操作数都为真,则结果为true,否则为false。 与&不同,&&保证从左到右的评估: 如果第一个操作数为假,则不评估第二个操作数。
C ++使用衬衫电路评估 。 因此,在某种程度上它将以这种方式工作。
我实际上并没有以这种方式评估和优化代码,但它将在汇编代码中进行评估。
&&运算符是短路的。 换句话说,如果a.c1 == b.c1无法评估为true,则甚至不会评估a.c2 == b.c2。
它类似于您描述的解决方案,但它是C ++语言的一部分(并且比显式键入嵌套的if语句更容易阅读)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.