const_cast引发的常量折叠思考

<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;
    反汇编结果如下:



    可以看出,和常量相关的,可以直接计算出该结果,其实就是直接使用字面值,而不是其他方式的引用。

    简单来讲,这就是常量折叠。

    概括来讲,这也是开始那个程序输出结果的解释。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值