14.2 volatile
volatile 关键字会对编译器的优化环节产生比较大的影响。
C 语言的计算模型主要是冯诺伊曼模型。并不支持并行的程序执行,而且编译器会在不改变程序可以观察到的行为之外尽其所能进行优化。编译器在优化时采用的手段中,可能有对指令的重新排序或者在寄存器中缓存变量。如果程序中读取一个从来没有写入过内存的变量,那么会直接删除这条指令。
然而读和写 volatile 变量不会被优化。这种类型的变量的操作顺序也会被保证。
该关键字主要的使用场景有这么几种:
- 内存映射 I/O,即使用专用内存区域与外部设备通信。比如将一个字符写入到视频内存(这样就会在屏幕上显示出这个字符)的场景。
- 线程之间共享数据。如果内存被用来与其它线程通信,你肯定不希望读或者写请求被优化掉。
注意,只靠 volatile 来进行线程间的通信并不足够。
就像 const 修饰符来修饰指针时一样,volatile 可以用来修饰指针本身或者指针指向的数据区。规则上是一样的:volatile 在星号左边的话就表示修饰是指针指向的数据,在右边的话表示修饰指针本身。