是否允许编译器通过将语句(不是表达式的一部分)从之后的易失性访问之前移动,或者从易失性访问之后移动到之前来优化代码流。
参考我对SO : is volatile required for synchronous ISR access
的回答对我的回答的反对意见表明,使用volatile不会导致C ++(和C)的通用机器确保完成所有操作。
我阅读cppreference : const volatile
也就是说,在单个执行线程内,无法优化输出易失性访问,或者在易失性访问之后对其进行排序或排序的另一个可见副作用进行重新排序。这使得易失性对象适合与信号处理程序通信,但不适用于另一个执行线程
对于我的回答中的案例 - 单核操作以下应该是真的。
我对这个帖子的回答假设特定情况是单核CPU,并且C ++ 11不适用,所以我更希望在该范围内得到答案。
答案 0 :(得分:1)
C ++标准没有区分代码流的内容和代码的作用。因此,所有关于代码流而不是可观察行为的问题都是特定于平台的问题。
兼容的C ++编译器无法对易失性写入进行重新排序操作,因为它是一种可见的副作用。
没人理解这个标准。这就是x86编译器不在volatile
操作周围放置内存障碍并允许CPU重新排序的原因。