C++——volatile关键字

1、定义

类型修饰符,表示可以被某些编译器未知的因素更改(OS、硬件、线程...)

用来解决变量在“共享”环境下容易出现的读取错误的问题

2、特点

用voliatile来声明的变量或对象通常具有与优化、多线程相关的特殊属性。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

volatile 关键字用来阻止(伪)编译器对其认为的、无法“被代码本身”改变的代码(变量或对象)进行优化。

编译器对访问该代码的变量不再进行优化,可以提供对特殊地址的稳定访问,系统总是从它所在的内存读取数据。

如果该变量没有使用 volatile 关键字进行声明,则编译器可能会优化读取和存储操作,可能暂时使用寄存器中该变量的值,而如果这个变量由别的程序(线程)更新了的话,就会出现(内存中与寄存器中的)变量值不一致的现象。

3、使用 volatile 关键字声明的变量具有的三种特性

易变

volatile 的易变性体现在:假设有读、写两条语句,依次对同一个 volatile 变量进行操作,那么后一条的读操作不会直接使用前一条的写操作对应的 volatile 变量的寄存器内容,而是重新从内存中读取该 volatile 变量的值。

volatile int nNum = 0; // 将nNum声明为volatile 
int nSum = 0; nNum = FunA(); // nNum被写入的新内容,其值会缓存在寄存器中
 nSum = nNum + 1; // 此处会从内存(而非寄存器)中读取nNum的值

不可优化

volatile 会告诉编译器,不要对 volatile 声明的变量进行各种激进的优化(甚至将变量直接消除),从而保证程序员写在代码中的指令一定会被执行。

volatile int nNum; // 将nNum声明为volatile
nNum = 1; 
printf("nNum is: %d", nNum); 
//解释:
//如果变量 nNum 没有声明为 volatile 类型,则编译器在编译过程中就会对其进行优化, 直接使用常量“1”进行替换(这样优化之后,生成的汇编代码很简介,执行时效率很高)。 而当我们使用 volatile 进行声明后,编译器则不会对其进行优化,nNum 变量仍旧存在, 编译器会将该变量从内存中取出,放入寄存器之中,然后再调用 printf() 函数进行打印。

顺序执行

保证 volatile 变量间的顺序性,不会被编译器进行乱序优化。

说明:

C/C++ 编译器最基本优化原理:保证一段程序的输出,在优化前后无变化。

4、volatile变量的应用场景

并行设备的硬件寄存器

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

一个中断服务子程序会访问到的非自动变量

5、其他

一个参数既可以是const、也可以是volatile

如:只读的状态寄存器,它是volatile:可能被意想不到的改变;它是const:程序不应该试图修改它

指针可以是volatile

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值