先看一个示例
int main() {
const int CONST_NUM = 10;
int* p = const_cast<int*>(&CONST_NUM);
*p = 20;
cout << "CONST_NUM = " << CONST_NUM << endl;
cout << "*p = " << *p << endl;
}
在代码中我们是这样一个流程
首先声明了一个局部常量 const int CONST_NUM = 10;
然后通过 const_cast 去除了指向 CONST_NUM 的指针的常量属性
接着通过指针 p 对 CONST_NUM 进行了修改
最后输出了 CONST_NUM 和 *p 的值
我们来看一下输出结果
CONST_NUM = 10
*p = 20
CONST_NUM 的 值居然和 *p 是不同的, 这是什么原因呢
其实是c++ 存在 const 优化, 在 c 语言中没有 const 优化 , CONST_NUM 和 *p 的值就是相同的
那么什么是 const 优化 呢
其实是 c++中用const定义了一个常量后,不会真正给它分配一个空间,而是将其写入符号表(symbol table),使得它成为一个编译期间的常量,通过指针去修改常量对应的内存空间中时,不会影响到常量本身的值,因为使用该常量的时候,编译器不会去进行内存空间的读取。而会直接从符号表中直接取值替换, 这就是 c++ 的常量折叠(constant folding), 除非当用到这个常量的存储空间的时候,编译器才会分配一个空间给它, 但是当我们输出 CONST_NUM 的值的时候还是从符号表中去取值替换到我们 使用 CONST_NUM 的位置,这也就导致了 CONST_NUM 的 值和 *p 是不同的。
如果我们想 让 CONST_NUM 的 值和 *p 是相同的话, 可以使用 volatile 关键字 告诉编译器不要做优化。这样结果就相同了
示例
int main() {
volatile const int CONST_NUM = 10;
int* p = const_cast<int*>(&CONST_NUM);
*p = 20;
cout << "CONST_NUM = " << CONST_NUM << endl;
cout << "*p = " << *p << endl;
}