想送你个超级可爱的礼物,可是快递员不让我钻进箱子 ----@瘦子打造营
C语言关键字volatile,表明此关键字声明的变量系统每次读取的时候要从内存中读取。
这是对volatile关键字的解释,仅仅停留在这个概念而已。要想真正了解这个关键字,还需要了解一下编译器、多进程及寄存器方面的知识。
首先,简单了解一下编译器,所谓“编译器”,其实就是一个翻译官。人有人的语言,机器有机器的语言,人写的语言机器看不懂,因此需要一个起翻译功能的东西,编译器就充当了这个角色。编译分为四步,1:预处理;2:编译;3:汇编;4:链接。其中,编译过程把预处理完的文件进行分析及优化后生成汇编代码,其中有编译优化过程,也就是说为了提高效率,编译器改变了程序本来的意思,比如:如果有相同的字符串可以整合到一个地址,为了提高访问速度,把一部分内容拷贝到缓冲区比从内存访问速度快。(为提高机器整体性能,在硬件上引入硬件高速缓存(Cache),加速对内存的访问,将经常用到的数据放到Cache中)。
但是有个缺点:
数据存在于内存a中,需要访问时将它拷贝到缓冲区(不可能随时随地拷贝,不可能缓冲区一更新就写回内存,有时间差)会有一个情况:有两个进程同时访问内存a,可能进程1更新了a的值,但还没有拷贝回去时间片就到时间了,这个时候进程2读a的值(从内存中读),读到的数据是未更新的,这就是编译优化的缺点。
这种时候我们不希望编译器进行优化,就要用到volatile关键字。
例:
int square(int *ptr)
{
return *ptr * *ptr;
}
程序很简单,愿意是想返回ptr指向的值的平方,但是前一个值和后一个值可能不同。
相当于:
int square(int *ptr)
{
int a, b;
a = *ptr;
b = *ptr;
return a*b;
}
volatile关键字主要用于以下三种情况:
1、中断服务程序中修改的供其他程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的寄存器通常加volatile,因为每次读写的意义可能不同。
编译优化有好处也有坏处,C语言的运行效率比汇编低了不少,优化十分有必要,但全按照它优化的来可能得到的结果不是我们想要的,总之要谨慎使用。
QQ:1786610699 倔强的木木 2017年10月23日