const_cast引发的常量折叠思考
2015-07-15 12:14
417 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 在学习</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><strong><em>const_cast</em></strong></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">转换之后,小小地测试了一下,然后就发现了一个不大不小的问题——论</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><strong><em>coding</em></strong></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">的重要性!!!</span>
测试代码如下:
const int i = 5; int *pj = const_cast<int *>(&i); *pj = 6; cout << "*pj = " << *pj << endl; cout << "i = " << i << endl; cout << "pj = " << pj << endl; cout << "&i = " << &i << endl;
结果却如下所示:
看起来好像不如意:1.本来是想着i的输出结果应该也是6;2.如果1不成立,那么pj的值和&i的值不应该相等,然而这两个猜想都错了,所以肯定有哪里是我不知道的。嗯!
上网查了一下,发现了一个很有意思的概念——常量折叠!!
其实常量折叠,理解起来很简单,由于在定义的是常量,所以编译器默认该值不会被修改,在后面编译有关该变量的时候就可以直接使用该字面值,而不是采用传递相关信息(如地址)需要间接关系才能获取的,其实这也是编译器优化代码的一个步骤吧。
需要注意的是:如果代码是
cout << *(&i) << endl;这一行代码的输出和i的值是一样的,刚开始我也困惑为什么通过地址获取还是一样发生了折叠ne,个人猜想其实这里也和编译器的优化有关,也就是编译器直接优化*(&i)为i啦,所以直接输出i的结果是一样的。
最后,把一个很有说服力的结果贴上,也就是测试上面的反汇编代码
源码如下:
int i = 5; int j = 3 * i; const int ci = 6; int k = 3 * ci;反汇编结果如下:
可以看出,和常量相关的,可以直接计算出该结果,其实就是直接使用字面值,而不是其他方式的引用。
简单来讲,这就是常量折叠。
概括来讲,这也是开始那个程序输出结果的解释。
相关文章推荐
- vim编辑器常用命令汇总
- AlertDialog
- 欢迎使用CSDN-markdown编辑器
- 文章标题
- Java调用Hadoop API
- Indy10 即时通讯Demo
- TECHNOLOGY: Oracle ADF Service, Please!
- 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix
- js原生弹出框
- CCF 201503-3 节日
- 世界很残酷,交友须谨慎
- 用户登录提交前,密码加密传输
- WPF性能优化经验总结
- Django框架中方法的访问和查找
- [LeetCode][Java] Jump Game
- Android应用开发学习—Toast使用方法大全
- HTML5 HybridApp开发上手指引
- 网站不收录可能是受同服务器上的挂马站牵连
- Microsoft Office Enterprise 2007 在安装过程中出错的解决方法
- 利用case when 减少表扫描次数