繁体   English   中英

C ++优化语句

[英]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 ++编译器不执行此类操作,因为它可能有副作用。 但这些都是内置类型。

  • 标准中有什么相关内容吗?
  • 如果它是编译器特定的主流编译器(MS,GNU,Intel)正在做或不做?

是。 以下代码段:

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 
  1. &&运算符从左到右分组。 操作数都隐式转换为bool类型(第4节)。 其结果是true ,如果两个操作数都是truefalse ,否则。 &不同, &&保证从左到右的评估:如果第一个操作数为false则不评估第二个操作数。

||的规则类似 运营商:

ISO / IEC C ++标准14882§5.15逻辑OR运算符[expr.log.or]

 logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression 
  1. || 操作员组从左到右。 操作数都隐式转换为bool (第4节)。 如果其任一操作数为true ,则返回true否则返回false |不同 || 保证从左到右的评估; 此外,如果第一个操作数的计算结果为true则不计算第二个操作数。

有条件的? 运营商:

ISO / IEC C ++标准14882§5.16条件运算符[expr.cond] conditional-expression:logical-or-expression logical-or-expression? 表达式:赋值表达式

  1. 条件表达式从右到左分组。 第一个表达式隐式转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM