一下代码输出什么?
const int i = 1; int *j =(int*) &i; *j = 22; cout << &i << " " << j << endl; cout << i << " " << *j << endl;
const变量的地址取值后 发现结果竟然不一样 既然是同一个地址 为什么会是不同的结果,初步认为是数据存储区不一样的问题,然后进一步发现非也。
既然最初设计为const 那么开发者肯定不想对这个变量修改 那么编译器可以优化为 立即数 替 换原来引用 的地方 从而提高效率,之后上面代码为
const int i = 1; int *j =(int*) &i; *j = 22; cout << &i << " " << j << endl; cout << 1 << " " << *j << endl;
volatile 告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中读取,因而编译器生成的可执行码会重新从i的地址读取数据
volatile 关键字可以 禁止编译器这种优化行为
但是对于new 这种const 值是无法确定的 所以编译器无法优化 ,如下例
int * const i = new int; int *j = (int*)i; *j = 22; cout << i << " " << j << endl; cout << *i << " " << *j;
限制的i的值 运行期才能决定 所以编译期 编译器无法优化,也就不存在那个”疑惑“了
转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/654545
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109087.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...