C++优化语句

Cem*_*ncu 2 c++ optimization

请考虑以下声明:

 C a, b; //C contains c1, c2 and c3 all integers

if(a.c1==b.c1 && a.c2 == b.c2) {
     a.c3=b.c3;
 }
Run Code Online (Sandbox Code Playgroud)

此声明是否会针对以下内容进行优化:

 if(a.c1 == b.c1) {
    if(a.c2 == b.c2) {
       a.c3=b.c3;
    }
 }
Run Code Online (Sandbox Code Playgroud)

AFAIK,C++编译器不执行此类操作,因为它可能有副作用.但这些都是内置类型.

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

In *_*ico 8

是.以下代码段:

C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2)
{
    a.c3=b.c3;
}
Run Code Online (Sandbox Code Playgroud)

将被"优化"到这个(或类似的东西):

if(a.c1 == b.c1)
{
    if(a.c2 == b.c2)
    {
        a.c3=b.c3
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是因为优化,而是因为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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  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)之外,第一个表达式的所有副作用都发生在评估第二个或第三个表达之前.仅评估第二和第三表达式中的一个.