我知道有volatile
的问题,但我想我会问另一个问题。我不知道它的作用(一般情况下),我的问题是:volatile
关键字 ONLY 是否阻止编译器优化使用volatile变量的代码或者任何此关键字的其他内容?
答案 0 :(得分:4)
退出编译器。编译器是C ++中最不感兴趣的方面,并且通常不会影响您对语言的看法。
该语言可以说volatile
:
1.9,1释义:
严格按照抽象机的规则评估对volatile对象的访问。
...
访问由
volatile
glvalue指定的对象是副作用,这是执行环境状态的变化。...
实现可能假设任何线程最终将执行以下操作之一:
- ...
- 访问或修改易失性对象
- ...
因此,正如您所看到的,volatile
对象在某种意义上是您的程序与外部世界的接口的一部分。其中一个后果是易失性访问被赋予了某些排序保证,但这只是一个细节。更大的图景是volatile
意味着"可能与环境互动"。
答案 1 :(得分:2)
对volatile
变量的内存访问(读取和写入)保证按程序中指定的顺序发生。这就是全部,真的。这意味着不允许编译器对它们重新排序(禁用某些编译器优化),还必须发出其他指令以防止CPU重新排序它们。
请注意,这并不会阻止所有非volatile
内存访问在volatile
周围重新排序。它只能确保volatile
内存访问不会相互重新排序(并且它们不会被完全优化)