volatile 的作用

199 阅读1分钟
  • 主要的作用是让编译器不要优化当前修饰的这个变量,让CPU通过访问内存的方式读取这个变量
  • 问题来了,明明是优化,为什么还要去禁止它
  • 这就涉及到CPU访问变量的工作原理
    • 在计算机中,访问寄存器的速度要比访问内存快得多
    • CPU访问寄存器的机制是这样的
      • 找到相关的位
      • 读取这些位
      • 所以这是很快的
    • CPU访问内存的机制是这样的
      • 先找到数据的指针,这玩意可能存放在寄存器中,所是走了一次读寄存器的操作
      • 然后将指针送去内存管理单元(MMU),将这个虚拟的地址转换为真实的物理地址
      • 然后将物理地址送去内存控制器,找出这个地址在哪一条内存上
      • 然后确定数据在这条内存的哪一个块上
      • 然后从这个块读取数据
      • 然后将数据送去内存控制器
      • 最后送回CPU
    • 可以看出访问内存的步骤还是挺多的,导致慢
  • 然后如果频繁读取的话,效率就会很低
  • 所以编译器就会执行优化,将频繁用到的变量放到寄存器,然后CPU就可以直接读取
  • 但是,变量有可能因为未知的因素被修改,比如操作系统,硬件,其他线程,然后如果这个时候还去寄存器里读取的话,那么读出来的就是脏数据,所以为了避免这种情况,如果变量可能被意外修改的话,就使用 volatile 修饰,一般这样的变量有多线程共享的全局变量