c/c++ 理解volatile

定义

volatile keword indicates that a value may chang between different accesses, even if  it does not appear to be modify.This keyword prevents an optimizing compiler from optimizing away subsequent reads or writes and thus incorrectly reusing a stale value or omitting writes.  Volatile values primarily arise in hardware access(MMI/O),where reading from or writing to memory is used to communicate with peripheral devices, and in threading, where a different thread may have modified a value.

像const一样,volatile是类型修饰符,编译器不会去优化被volatile修饰的变量。volatile相当于告知编译器这些变量在被访问的时候,其值可能会发生变化,哪怕没有明显的赋值语句。所以每次使用这些变量的时候,都是直接访问内存而非寄存器。

例子

int x;

x= 11;

x=12;

对于硬件而言,11和12可能分别表示不同操作,但编译器会直接将其优化成()

int x;

x = 11。

而如果在int x前增加volatile修饰,则编译器不会对其进行优化,会逐条编译并产生相应的机器码。

使用场景

volatile在C中主要用于(英语部分摘录自wikipedia)

1、allow access to memory-mapped I/O devices;

eg.

假设要使得管脚x控制灯每S闪烁一次,那可能会这样写: x = 0; sleep(1); x=1。定义时不对x增加volatile类型修饰,则该代码就会被优化成x=1,导致结果与预期不一致,灯也不会定时闪烁。

2、allow uses variables between setjmp and longjmp;

多线程中,对同一变量进行处理,可能导致变量发生意想不到的变化,如果不对变量加volatile的修饰,则当该变量被其他线程改变了,当前线程依然从寄存器访问该变量,从而获得的是旧数据。

3、allow uses sig_atomic_t variables in signal handlers.

(在处理信号(signal)的时候,有时对于一些变量的访问希望不会被中断,无论是硬件中 断还是软件中断,这就要求访问或改变这些变量需要在计算机的一条指令内完成,像int类型或者更小的类型,但当把变量声明为sig_atomic_t 类型时候,则会保证该变量在使用或赋值时, 无论是在32位还是64位的机器上都能保证操作是原子的, 它会根据机器的类型自动适应。)

猜你喜欢

转载自www.cnblogs.com/Daomy/p/9696298.html
今日推荐