繁体   English   中英

中间值和线程安全

[英]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.

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