Volatile的作用
volatile 表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新存取。
Const 和 Volatile的示例
示例1
int main()
{
const int a = 1;
int* pa = const_cast<int*>(&a);
*pa = 4;
cout << a << endl;
cout << *pa << endl;
}
输出:
1
4
对const常量a, 通过访问地址把它的值修改了。
再直接调用a,它还是修改之前的值。
示例2
int main()
{
volatile const int a = 1;
int* pa = const_cast<int*>(&a);
*pa = 4;
cout << a << endl;
cout << *pa << endl;
}
输出
4
4
通过volatile修饰const常量a。
对const常量a, 通过访问地址把它的值修改了。
再直接调用a,它是修改后的值。
示例3
const int a = 1;
int main()
{
int* pa = const_cast<int*>(&a);
*pa = 4;
cout << a << endl;
cout << *pa << endl;
return 0;
}
输出
如果是全局const 常量,是不允许通过访问地址的方式修改的(可以访问地址读,但是不能写)。
所以也就不存在const优化,和volatile修饰的问题。
结论
以上就是volatile修饰符的作用,它告诉编译器它修饰的对象是一个会改变的值,不要对它进行优化。
如果不用volatile修饰,某些时候,编译器会对变量进行优化,会把它的值存储在寄存器(或者别的地方)方便快速读取。如果这个变量改变了,编译器还是从寄存器快速读取,就会发生问题。
参考
C和C++里的const常量、volatile修饰符的深层次说明 <- 挺详细,有时间建议看这个