volatie跟const一样,是类型修饰符
(1)修饰变量后,编译器对该访问该变量的代码不再优化
编译器对代码的优化
int main() {
int i = 0;
i++;
cout << “hello world” << endl;
}
按照代码,这个程序会在内存中预留int大小的空间,初始化这段内存为0,然后这段内存中的数据加1,最后输出“hello world”到标准输出中。但是根据这段代码编译出来的程序(加-O2选项),不会预留int大小的内存空间,更不会对内存中的数字加1。他只会输出“hello world”到标准输出中。
(2)volatile 在 C 以及 C++ 中,用于指示该变量属于硬件 I/O 地址。(换句话说就是,变量指向的地址会被程序以外的不可知作用改变,基本上在写驱动以及 BSP 以及一些硬件相关的代码的时候才会需要用到这个关键字。)
volatile虽然最常见的用处是用于中断涉及的变量,但多线程当中也是常用的,一个常见的例子叫做自旋(spin)锁,为了提高多核处理器上锁的效率,使用一个自旋变量,当锁无法获取时,首先循环一定次数检查自旋变量的值,从而判断锁是否被解开,如果短时间内锁被解开,就可以省去系统内核调用将线程挂起再唤醒的开销。这个自旋变量就必须设置为volatile,否则循环再多次都是读取寄存器中的值,不可能发生改变。