您的位置:首页 > 其它

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





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

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

概括来讲,这也是开始那个程序输出结果的解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: