C语言关键字浅析-volatile

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/84313249

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

volatile作为一个单词可能有人都不认识(比如我),查了一下,其英文意思为“易变的;不稳定的;挥发物”

待仔细了解了一番volatile关键字的用法后,我就领会到了为啥人家歪果仁把这种用法叫做volatile

作为类型限定词,volatile其实是用户与编译器的一种对话,不过用得也挺少的

volatile的作用是:

告诉编译器一个变量除了可以被程序改变,还可以被其他代理改变。

同样作为类型限定词,你可以把volatile看做restrict的对立面,后者表示变量固定、唯一(详见相关文章-restrict关键字)

volatile表示一个易变的位置,比如用一个地址保存当前的时间,那么这个地址中的数据是随时都在改变的

volatile int a;    /* a是一个易变的位置 */
volatile int *p;   /* p指向一个易变的位置 */

上述说过,volatile是一种与编译器的对话,何以见得呢?看下面这段code:

var1 = x;  /* 第一次用x */
……         /* 这部分是不用x的代码 */
var2 = x;  /* 第二次用x */

优秀的编译器能发现,你用了两次x,且x值没有改变,并且在中间的过程中没有使用x,这时候它会把x存在一个寄存器中

为的是得到更快的速度,该过程叫做缓存(caching)

在ANSI前,上述情况下,没有volatile编译器是不敢轻举妄动去把x存到寄存器,即使用缓存的神操作的

而ANSI后,优秀的编译器即使在没有volatile的情况下,也敢放开手脚去检查是否有上述情况,然后尝试着把x缓存

另外,volatile和const可以同时存在,即一个值可以同时是volatile和const的:

const volatile int a;   /* 萍水相逢,顺序什么的,无所谓 */
volatile const int b;

比如硬件时钟,程序不可改变,呈现const属性,而其可以被程序外的代理改变,故是volatile的

——参考《C Primer Plus第五版》

相关文章:

C语言关键字浅析-restrict

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/84313249