C++ const与volatile
volateile的含义是不稳定的,易变的。在C++里,表示变量的值可能会以难以察觉的方式(比如操作系统信号、外部其他的代码)被修改,所以禁止编译器进行任何形式的优化,每次使用的时候都必须老老实实的去取值。
const volatile int MAX_LEN = 1024;
auto ptr = const_cast<int*> (&MAX_LEN);
*ptr = 2048;
std::cout << "MAX_LEN: " << MAX_LEN << "\n";
这段代码最开始定义的常数MAX_LEN为1024,最后的输出却为2048,但如果去掉volatile修饰,则最后会输出1024。MAX_LEN虽然是只读变量,但有volatile修饰,就表示它不稳定,可能会悄悄改变。编译器在生成机器码的时候,就不会再去进行那些可能有副作用的优化,也就是说编译器不会再去把MAX_LEN替换为1024,而是生成去内存取值的CPU指令,到实际运行的时候MAX_LEN已经通过指针被强制修改了,所以上面的那段代码最后输出的是2048,而不是1024。
最好把const理解成read only,把变量标记成const可以让编译器更好的进行优化。