"volatile"只会阻止编译器优化吗?
Does "volatile" only prevent from compiler optimisation?
我知道关于volatile
有很多问题,但我想我问了一个不同的问题。我不问它(通常)有什么作用,我的问题是:volatile
关键字ONLY是否阻止编译器优化使用易失性变量的代码,或者这个关键字还有ANYTHING其他作用吗?
忽略编译器。编译器是C++中最不有趣的方面,通常不会在你如何看待语言方面发挥作用。
该语言对volatile
:有这样的描述
1.9,1转述:
对易失性对象的访问严格按照抽象机器的规则进行评估。
访问由
volatile
glvalue指定的对象是副作用,这是执行环境状态的变化。实现可能假设任何线程最终都会执行以下操作之一:
- 访问或修改易失性对象
因此,正如您所看到的,volatile
对象在某种意义上是程序与外部世界接口的一部分。其后果之一是,易失性访问得到了某些排序保证,但这只是一个细节。更大的画面是CCD_;可以与环境相互作用";。
针对volatile
变量的内存访问(读取和写入)保证按程序中指定的顺序进行。真的,仅此而已。这意味着编译器不允许对它们进行重新排序(禁用某些编译器优化),但还必须发出额外的指令来防止CPU对它们进行排序。
请注意,这并不能阻止所有非volatile
内存访问围绕volatile
内存访问进行重新排序。它只确保volatile
内存访问不会相对于彼此重新排序(并且不会完全优化)
相关文章:
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++编译器是否优化了顺序静态变量读取?
- VS2017调试器:没有地址,可能是由于编译器优化
- 何时允许编译器优化复制构造函数
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- static_assert有助于优化编译器吗?
- 哪个优化编译器开关使调试非常困难
- 优化编译器可以添加std::move吗
- VisualStudio 优化编译器版本 19.00.23506.0 中存在明显的编译错误
- C++是否允许优化编译器忽略对 for 条件的副作用
- 优化编译器能否从 std::unique_ptr 中消除所有运行时成本
- Microsoft c++优化编译器不断崩溃
- 优化编译器如何决定何时展开循环以及展开多少循环
- 有一个很好的测试c++优化编译器
- Mac上的g++链接时间优化-编译器/链接器错误
- visual_itoa_s一直在杀死c++优化编译器,为什么?
- Microsoft C/C++ 优化编译器编译到什么
- 优化编译器消除bug