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

Does "volatile" only prevent from compiler optimisation?

本文关键字:优化 编译器 volatile      更新时间:2023-10-16

我知道关于volatile有很多问题,但我想我问了一个不同的问题。我不问它(通常)有什么作用,我的问题是:volatile关键字ONLY是否阻止编译器优化使用易失性变量的代码,或者这个关键字还有ANYTHING其他作用吗?

忽略编译器。编译器是C++中最不有趣的方面,通常不会在你如何看待语言方面发挥作用。

该语言对volatile:有这样的描述

1.9,1转述:

对易失性对象的访问严格按照抽象机器的规则进行评估。

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

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

  • 访问或修改易失性对象

因此,正如您所看到的,volatile对象在某种意义上是程序与外部世界接口的一部分。其后果之一是,易失性访问得到了某些排序保证,但这只是一个细节。更大的画面是CCD_;可以与环境相互作用";。

针对volatile变量的内存访问(读取和写入)保证按程序中指定的顺序进行。真的,仅此而已。这意味着编译器不允许对它们进行重新排序(禁用某些编译器优化),但还必须发出额外的指令来防止CPU对它们进行排序。

请注意,这并不能阻止所有非volatile内存访问围绕volatile内存访问进行重新排序。它只确保volatile内存访问不会相对于彼此重新排序(并且不会完全优化)