版权声明:本文为博主原创文章,未经博主允许不得转载。 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