编程语言应用

注册

 

发新话题 回复该主题

Volatile关键字在C语言中的作用 [复制链接]

1#

Volatile关键字

首先这个关键字呢在C语言编程里面相对来说出现的并不是很多,包括最开始学C语言的时候我都没有接触到这个关键字,后来看到了一个C语言的笔试题我通过查找资料才了解到这个关键字现在和大家一起共同探讨一下。

volatile这个关键字出现的场合在操作系统编程、硬件开发、嵌入式系统或者是其他的线程遇到的概率会大一些。这个关键字本身的意思是它所修饰的变量是不稳定的,在运行过程中有可能会被改变成新的值。

我们程序加载到内存里面然后一些计算变量在加载到缓存,最后到寄存器参加CPU的运算,流程大概是这样的,记住这个流程之后我们就来看一下volatile关键字到底在哪个环节起着什么样的作用。

我们看一下上面的代码,在外面对代码进行编译的时候我们的编译器会对我们的代码做出一些优化,我们都知道计算机的惰性原则,为了计算速度往往不会去执行没用的操作,在优化代码的时候它发现b和c的值都是等于a的,所以在执行intb=a;的时候他会到内存中把a的值10取出来赋值给b,这一点没什么毛病,但是下一条语句它发现c也是等于a的,本来按照刚刚的流程进到内存里面把a拿出来再给c就可以了,但是编译器发现执行“intb=a”的时候已经拿过一次a了,并且a的值还没有改变,那它为了省事它就不到内存去拿了而是把刚刚拿出来在缓存里的a给了c,这样就减少了一个读取的操作,提高了效率。

Volatile关键字修饰后的代码

我们再来看这段代码,和刚刚的代码相比较起来呢我们在“inta=10”前面加了volatile关键字,那这时候我们在来分析一下程序会怎么跑;首先被声明volatile的变量在编译的时候它就告诉编译器,这个变量可能会在运行的时候突然发生会改变,每一次取值必须到内存里面取值。就这样编译器就不会对它进行优化,intb=a;和intc=a;两个赋值的时候它都需要跑到内存去取a的值。这样就确保我们可以拿到变化后的值,确保程序不会出错。

一道面试题

const是不可变得意思和volatile是会改变的意思,那如果哪两个关键字同时修饰一个变量是什么意思?

如:constvolatileinta=1;

首先const是指A程序不能对a变量的值进行修改,但是B程序可能会对a的值修改,恰好A程序有在检测a这个变量,那这时候就需要这两个关键字同时去修饰变量。

不知道对于这个问题你们有没有其他的答案或者是想法可以在下面一起探讨交流一下!

分享 转发
TOP
发新话题 回复该主题