“volatile”只会阻止编译器优化吗?

时间:2014-10-12 10:27:43

标签: c++ volatile

我知道有volatile的问题,但我想我会问另一个问题。我不知道它的作用(一般情况下),我的问题是:volatile关键字 ONLY 是否阻止编译器优化使用volatile变量的代码或者任何此关键字的其他内容?

2 个答案:

答案 0 :(得分:4)

退出编译器。编译器是C ++中最不感兴趣的方面,并且通常不会影响您对语言的看法。

该语言可以说volatile

1.9,1释义:

  

严格按照抽象机的规则评估对volatile对象的访问。

     

...

     

访问由volatile glvalue指定的对象是副作用,这是执行环境状态的变化。

     

...

     

实现可能假设任何线程最终将执行以下操作之一:

     
      
  • ...
  •   
  • 访问或修改易失性对象
  •   
  • ...
  •   

因此,正如您所看到的,volatile对象在某种意义上是您的程序与外部世界的接口的一部分。其中一个后果是易失性访问被赋予了某些排序保证,但这只是一个细节。更大的图景是volatile意味着"可能与环境互动"。

答案 1 :(得分:2)

volatile变量的内存访问(读取和写入)保证按程序中指定的顺序发生。这就是全部,真的。这意味着不允许编译器对它们重新排序(禁用某些编译器优化),还必须发出其他指令以防止CPU重新排序它们。

请注意,这并不会阻止所有非volatile内存访问在volatile周围重新排序。它只能确保volatile内存访问不会相互重新排序(并且它们不会被完全优化)