volatile 相当于告诉编译器, 由它声明的变量是易变的, 不确定的, 可能由外部程序 (如中断程序) 改变的, 禁止编译器对其读写操作进行优化。
const修饰的变量则表示该变量在程序中只能读不能写,因此,也称其为常量。
当对变量定义成volatile const时,“变”与“不变”之间是不是常常让我们困惑呢?既是常量,但又是可能被修改的……,怎么可以这么定义呢?
我们先好好理解变与不变的意思。 程序运行要先编译再真正被CPU执行,即包含了把源代码转化为机器代码的过程的编译期 和 实际代码在CPU执行的运行期。const ,只是编译器保证在“源代码”里面,没有对该变量进行修改的地方,而实际运行的时候则不是编译器所能管的了。
volatile的所谓“可能被修改”,是指“在运行期间”可能被修改。也就是告诉编译器,这个变量不是“只”会被这些“源代码”所操纵,其它地方也有操纵它们的地方。
volatile会禁止编译器优化。
什么是编译器优化呢?它指的是当一个变量被声明为const时,编译器认为该变量在某一段代码(如一个函数)中不会发生改变,就会将该变量存储到CPU的寄存器,从CPU寄存器读写数据的速度要远远快于从内存读取数据。
当加上volatile时禁止编译器优化,也就是说,不允许将该数据保存到CPU寄存器,因为保存到CPU寄存器的变量可能在某些情况下被改变,例如,另一个线程可能会改变该寄存器的值,这样就会导致你原本以为是const的变量发生了改变,导致了问题。
而使用volatile const声明就避免了这种情况。
不矛盾了吧^^

