表达式如下:
a = b + c;
编译器是否可能优化上面的代码:
a = b;
a += c;
我真正想知道的是,其他线程是否可以在=
左侧的变量中看到中间计算的结果。
答案 0 :(得分:1)
使用as-if规则,优化编译器可以(几乎)使用不涉及原子的表达式(几乎)做任何事情,因为没有其他线程可以观察到无数据竞争程序中的差异。所以是的,编译器可以做到这一点,其他线程只能通过数据竞争看到中间结果。
答案 1 :(得分:-1)
我现在无法访问该标准,但根据http://en.cppreference.com/w/cpp/language/eval_order:
8)内置的副作用(左参数的修改) 赋值运算符和所有内置复合赋值运算符 在计算值(但不是副作用)之后进行排序 左右参数,并在值之前排序 计算赋值表达式(即返回之前) 对修改对象的引用)
这似乎是在评估a
之后对b + c
的修改进行了排序,因此编译器无法分两步修改a
。
这并不妨碍优化器做任何它喜欢的事情,但我看不出它会写入a
两次的任何理由。