文档章节

const变量取地址-引起的疑惑

梦想游戏人
 梦想游戏人
发布于 2016/04/07 15:32
字数 331
阅读 51
收藏 0

一下代码输出什么?

 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的值 运行期才能决定 所以编译期 编译器无法优化,也就不存在那个”疑惑“了



© 著作权归作者所有

梦想游戏人
粉丝 41
博文 472
码字总数 184853
作品 0
成都
私信 提问
mutable和volatile的区别

1.mutable 在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被...

风雅轩
2017/10/24
0
0
经典问题分析一

本文均来自狄泰软件学院 const常量的判别准则 只有用字面量初始化的const常量才会进入符号表 使用其它变量初始化的const常量仍然是只读变量 被volatile修饰的const常量不会进入符号表 在编译...

Sugar_v5
2017/06/16
0
0
数组知识整理归纳

数组的创建 其中[ const_n]中const_n必须是常量,不能像下面这样 2.数组的初始化 定义:在创建数组的同时给数组的内容⼀些合理初始值(初始化) 在初始化时一定要知道初始化的内存分配情况,...

triorwy
2018/02/07
0
0
C语言指针讲解(三)

谨记 哎,我......觉得你变了,我怎么变了?你以前是那么的听话,那么的在乎我,总是想象美好的生活而奋斗,遇到困难不断的去尝试克服,生活的态度总是那样积极向上的。而如今的你,变得总是...

长风留言
2017/11/14
0
0
或许有一两点你不知的C语言特性

关键字篇 volatile关键字 鲜为人知的关键字之一volatile,表示变量是'易变的',之所以会有这个关键字,主要是消除编译优化带来的一些问题,看下面的代码 1 int a = 8;2 int b = a;3 int c = ...

吕亚辉
2015/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何有效地计算JavaScript中对象的键/属性数量?

计算对象的键/属性数的最快方法是什么? 是否可以在不迭代对象的情况下执行此操作? 即不做 var count = 0;for (k in myobj) if (myobj.hasOwnProperty(k)) count++; (Firefox确实提供了一...

技术盛宴
22分钟前
2
0
百度网址安全中心拦截解除的办法分享

临近2019年底,客户的公司网站被百度网址安全中心拦截了,公司网站彻底打不开了,影响范围很大,于是通过朋友介绍找到我们SINE安全公司寻求帮忙解封,关于如何解除百度的安全拦截提示,下面就...

网站安全
34分钟前
3
0
Tomcat8源码分析-启动流程-start方法

上一篇:Tomcat8源码分析-启动流程-load方法 前面讲了启动流程中的Catalina.load,进一步调用绝大部分组建的init操作,主要完成对server.xml解析,并根据解析的结果结合设置的Rule(规则)构造...

特拉仔
42分钟前
6
0
Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍

Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍 轻拍标签栏中的About标签,进入关于页面,如图1.8和图1.9所示。它是对应用程序介绍的页面。 该页面源自Views文件夹中的AboutPage.x...

大学霸
48分钟前
3
0
一步一步理解Impala query profile(一)

很多Impala用户不知道如何阅读Impala query profile来了解一个查询背后正在执行的操作,从而在此基础上对查询进行调优以充分发挥查询的性能。因此我想写一篇简单的文章来分享我的经验,并希望...

九州暮云
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部