volatile变量与原子变量的差异

原子变量

  1. 能够保证其上的所有操作都是原子性的,不可分割的;
  2. 使用默认的内存序模型的原子变量可以保证编译器或者硬件不会对相关代码或指令进行重排;

volatile变量

  1. 不保证其上的所有操作都是原子性的;
  2. 编译器可能会对相关代码进行重排,或者CPU硬件进行指令重排;
  3. 告诉编译器不会优化那些冗余代码:
    int x;
    
    x = 20; // 使用volatile后,编译器不会把这一句优化掉
    x = 30;
    
    auto y = x; // 使用volatile后,编译器不会把这一句优化掉,但是如果是原子变量或者普通变量的话,这一句可能会被优化掉,或者将x的值存入寄存器,而y的值每次都是从寄存器里读取,而不是从内存读取
    y = x;
    
    
    volatile变量能够使得CPU对变量的存取直接放到内存中,而不是临时放到寄存器中。原子变量也可以加上volatile修饰符(实际上,编译器厂商对原子变量的实现基本都加上了volatile修饰符)。

你可能感兴趣的:(C/C++,原子变量,volatile,c++)