当前位置:网站首页>volatile 关键字(修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变)

volatile 关键字(修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变)

2022-08-10 00:59:00 泡沫o0


volatile 关键字作用:防止编译器过度优化,字面意思就是易变的、不可优化的、顺序执行的。

volatile关键字的介绍

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。

C/C++中volatile用来修饰一个变量,表示这个变量,表示这个变量可以被编译器之外的东西改变。

  • 说明
    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
    如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值;
    如果这个变量由别的程序更新了的话,将出现不一致的现象。

volatile关键字的使用场景

  • 并行设备的硬件寄存器

存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

  • 一个中断服务子程序中会访问到的非自动变量(全局变量)

中断服务程序中修改的供其它程序检测的变量需要加volatile

  • 多线程应用中被几个任务共享的变量

多任务环境下各任务间共享的标志应该加volatile


volatile关键字的作用

  • 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况. ​
  • 不做常量合并、常量传播等优化.
  • 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。

volatile与mutable关键字的区别

mutable只能用与类变量,不能与const同时使用;在const修饰的方法中,mutable变量数值可以发生改变;

volatile只是运行期变量的值随时可能改变,这种改变即可能来自其他线程,也可能来自外部系统。


另言

有时候没有volatile也可能能正常运行,但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常,但是release版本却不能正常的问题。所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。

volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,

原网站

版权声明
本文为[泡沫o0]所创,转载请带上原文链接,感谢
https://liucjy.blog.csdn.net/article/details/126241036