目录
1.volatile的理解
volatile作为C语言的32个关键字的其中一个,目前我们可能从未在代码中进行使用过。是因为它没有实际应用场景吗?并不是。volatile是一个特征修饰符,它是用来修饰易变的变量,告诉编译器每次需要读取这个变量时要到内存中去读取。
2.volatile的作用
1.寄存器与内存
首先我们要清楚,我们定义的变量都是在主存中(register除外),而每当我们需要对主存中数据进行操作时,CPU都需要先进行内存访问,然后将内存中的数据读取拷贝到寄存器中,最后在寄存器中对数据进行操作。CPU对各类存储器的访问速度如下:
CPU访问速度从上到下呈递减规律;硬件存储容量从下到上呈递增规律
2.volatile的作用
我们通过下面一段代码来分析其作用:
#include<stdio.h>
int main()
{
//int flag = 1; //不加flag修饰
volatile int flag = 1; //volatile修饰
while (flag)
{
;
}
return 0;
}
如上,我们写了一个死循环,而循程序其他地方没有对flag进行任何修改。这时,编译器就有很大概率会对代码进行优化,将flag变量缓存至寄存器中,使得CPU不在访问主存单元,直接对寄存器中的数据进行操作,提升CPU运行的速度。
但是,如果由于某种外部因素使的flag所在内存单元被修改了呢?如多线程,中断等情况。此时由于CPU没有不会访问内存更新数据,依旧会使用在寄存器保存的旧值,导致出错,显然我们不希望看到这种情况。这时我们就可以使用volatile,volatile关键字告诉编译器这个变量可能在某些情况会发生修改,使得编译器不进行优化,CPU每次使用这个变量需要重新读取内存。
3.总结
volatile被称作易变关键字,作用是告诉编译器这个变量可能被修改,需要每次都从内存中访问这个变量,达到稳定访问内存
3.几个小问题
1.问题一
问:既然volatile是易变关键字,而const修饰变量代表变量的内容不能被修改,那么二者能不能一起使用,会不会冲突呢?
答:可以一起使用,const要求你不要进行修改写入即可,而volatile意思是你读取数据的时候每次都要从内存中读取,两者并不冲突,作用的地方不同。
2.问题二
问:volatile可以用来修饰指针吗?
答:可以。volatile修饰指针表示指针指向空间的数据是易变的,编译器每次都需要访问内存。
3.问题三
问:以下函数能否实现计算一个整数的平方的功能?
int Squa(volatile int* &ptr) //声明为引用使外部可能更改 { int a = 0; int b = 0; a = *ptr; b = *ptr; return a*b; }
答:可能无法实现。volatile修饰*ptr,因此代表ptr指向空间的数据是易变的,需要访问内存。因此前后两次解引用后所得数据可能不同。正确的写法应该是:
int Squa(volatile int* &ptr) //声明为引用使外部可能更改 { int a = 0; a = *ptr; return a*a; }
以上,就是本期的全部内容。
制作不易,能否点个赞再走呢qwq