C语言关键字volatile

想送你个超级可爱的礼物,可是快递员不让我钻进箱子        ----@瘦子打造营    

  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日








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值