C++ const 变量的一个编译器优化小细节

const int a = 1;
const int* p = &a;
auto q = const_cast(p);
cout << a << endl;
*q = 2;
cout << a << endl;
cout << *q << endl;

volatile const int b = 1;
volatile const int* t = &b;
auto r = const_cast(t);
cout << b << endl;
*r = 2;
cout << b << endl;
cout << *r << endl;

以上程序的输出为
1
1
2
1
2
2
下面是具体分析:
对于const变量a,由指针p指向它,再由p得到非const的版本q以能够改变它的值,接着使用q改变a的值,但是发现将2赋值给a时,此时直接输出a的值仍是1,通过指针q输出a的值却是修改后的a的值(也就是2)。
这是因为C++编译器对const变量进行了优化,讲const的a放在了编译器的符号表中,这样做的目的是让取值操作变得更有效率,所以当我们用q去改变a的值之后,a所在地址存储的值确实改变了,但是符号表中的值没有变,此时直接输出a,输出的是符号表中的,而通过指针q输出的a才是真实的a的值。
对于第二部分,我们讲变量都加上volatile,这样每次访问变量时会重新去存变量的地址处取值,所以此时直接输出b的值是修改之后的真实的值,而不是符号表中存储的值。
接着我试了一下指针常量是不是也是一样的结果,发现当指针是常量时,却没有以上的特性,也就是说编译器没有对指针常量进行优化(没有把它存在编译器符号表中)。
注:以上环境vs2017,msvc。

你可能感兴趣的:(C++ const 变量的一个编译器优化小细节)