[英]Intermediate Values and Thread Safety
在像这样的表达式中:
a = b + c;
编译器是否可能优化上面的代码来执行以下操作:
a = b;
a += c;
我真正想知道的是,其他线程是否可以在=
左侧的变量中看到中间计算的结果。
使用as-if规则,优化的编译器可以(几乎)使用不涉及原子的表达式执行任何喜欢的操作,因为没有其他线程可以观察到无数据争用程序中的差异。 所以是的,编译器可以做到这一点,而其他线程只能通过数据争用看到中间结果。
我目前无法使用该标准,但是根据http://en.cppreference.com/w/cpp/language/eval_order :
8)内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在计算左参数和右参数的值(而不是副作用)之后进行排序,并且在赋值表达式的值计算之前排序(即,在将引用返回修改后的对象之前)
这似乎是在对a
的修改在b + c
求值之后进行排序,因此编译器无法分两步修改a
。
这不会阻止优化做什么它为所欲为,但我看不到任何理由是会写a
两次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.