笔记13:存储类型关键字volatile

(1)volatile的字面意思:可变的。C语言中volatile用来修饰一个变量,表示这个变量可以被编译器之外的东西改变。编译器之内的意思是变量的值的改变是代码的作用,编译器之外的改变就是这个改变不是代码造成的,或者不是当前代码造成的,编译器在编译当前代码时无法预知。譬如在中断处理程序isr中改变了这个变量的,譬如多线程中在别的线程中更改了这个变量的值,譬如硬件自动更改了这个变量的值(一般这个变量是一个寄存器的值)

(2)以上说的三种情况(中断isr中引用的变量,多线程中公用的变量,硬件会更改的变量)都是编译器在编译时无法预知的更改,此时应该使用volatile告诉编译器这个变量属于这种(可变的)情况。编译器在遇到volatile修饰的变量时就不会对该变量的访问进行优化,就不会出现错误。
int a, b, c;
a = 3;
b = a;
c = b;

//无优化情况下:内存要读取3次,写3次
//编译器优化为:内存只要读1次,写3次

(3)编译器的优化在一般情况下非常好,可以帮助提升程序效率。但是在特殊情况下(volatile)下,变量会被编译器想象之外的力量所改变,此时如果编译器没有意识到而去优化则就会造成优化错误,优化错误就会带来执行时错误。而且这种错误很难被发现。

(4)volatile是程序员意识到需要volatile然后在定义变量时加上了volatile,如果你遇到了应该加volatile的情况而没有加程序可能会被错误的优化。如果在不应该加volatile而加了的情况程序不会出错,只是会降低效率。所以我们对于volatile的态度应该是:正确区分,该加的时候加不该加的时候不加,如果不能确定该不该加为了保险起见就加上。

你可能感兴趣的:(C笔记)