• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
浅浅念
生如夏花之绚烂,死若秋叶之静美
博客园    首页    新随笔    联系   管理    订阅  订阅
Volatile的使用

  提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据,

  如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

  需要注意的是,没有volatile也可能能正常运行,但是可能修改了编译器的优化级别后又不能正常运行了,因此经常出现debug版本正常,但是release版本却不能正常的问题。

  所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字,此外多线程操作也要考虑使用volatile

volatile 的含义 

      volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以使代码消除。

  但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用: 

  1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。

  2 不做常量合并、常量传播等优化,所以像下面的代码: 

    volatile int i = 1; 

    if (i > 0) ... 

    if的条件不会当作无条件真。 

学习无他法,唯有持之以恒
posted on 2017-03-21 20:47  浅浅念  阅读(216)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3