用 volatile前
int main()
{
const int a = 1;
int *p;
p = const_cast<int*>(&a);
(*p)++;
cout << a << endl;
cout << *p << endl;
cout << "end mycast" << endl;
}
结果:(如果你调试会发现 p 和&a的 地址其实是一样的。调试的a的值也是2,打印出来却是1)
mycast
1
2
end mycast
用 volatile后
int main()
{
volatile const int a = 1;
int *p;
p = const_cast<int*>(&a);
(*p)++;
cout << a << endl;
cout << *p << endl;
cout << "end mycast" << endl;
}
结果:
mycast
2
2
end mycast
编译器优化之后,编译器会将常变量假定为一个不会被修改的值。
一般情况下的变量在使用的时候要从内存中取最新的值到寄存器中使用,
而常变量编译器则认为其不会被修改,所以直接读取寄存器中保存的值。而寄存器先保存,我们再继续修改,就导致即使修改了内存中的值,编译器也不会去取内存中的值。使用volatile关键字也可以避免编译器优化导致错误。