volatile是否是优化的编译器障碍

时间:2017-10-01 23:09:48

标签: c++ language-lawyer

是否允许编译器通过将语句(不是表达式的一部分)从之后的易失性访问之前移动,或者从易失性访问之后移动到之前来优化代码流。

参考我对SO : is volatile required for synchronous ISR access

的回答

对我的回答的反对意见表明,使用volatile不会导致C ++(和C)的通用机器确保完成所有操作。

我阅读cppreference : const volatile

  也就是说,在单个执行线程内,无法优化输出易失性访问,或者在易失性访问之后对其进行排序或排序的另一个可见副作用进行重新排序。这使得易失性对象适合与信号处理程序通信,但不适用于另一个执行线程

对于我的回答中的案例 - 单核操作以下应该是真的。

  • 结果尽可能快地显示 - 可能有一个点已经写入了对volatile的更改,但如果写入,那么单核将在信号处理程序中看到它(或ISR)。
  • 兼容的C ++编译器无法围绕易失性写入重新排序操作,因为它是一种可见的副作用。

我对这个帖子的回答假设特定情况是单核CPU,并且C ++ 11不适用,所以我更希望在该范围内得到答案。

1 个答案:

答案 0 :(得分:1)

C ++标准没有区分代码流的内容和代码的作用。因此,所有关于代码流而不是可观察行为的问题都是特定于平台的问题。

  

兼容的C ++编译器无法对易失性写入进行重新排序操作,因为它是一种可见的副作用。

没人理解这个标准。这就是x86编译器volatile操作周围放置内存障碍并允许CPU重新排序的原因。