const_cast引发的常量折叠思考

    在学习const_cast转换之后,小小地测试了一下,然后就发现了一个不大不小的问题——论coding的重要性!!!

    测试代码如下:

    const int i = 5;
    int *pj = const_cast(&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;
    反汇编结果如下:

const_cast引发的常量折叠思考_第1张图片
const_cast引发的常量折叠思考_第2张图片

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

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

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

你可能感兴趣的:(C++)