C++ 常量折叠

c 中const 常量用法
说明:c语言中const 常量可以很容易地被改变

#include <stdio.h>
#include <stdlib.h>
void main()
{
    const int a = 100;
    printf("a的地址是:%p\na的内容是:%p\n", &a, a);
    int* p = (int*)&a;
    printf("p的地址是:%p\np指向的内容是:%p\n", p,*p);
    *p = 200;
    printf("p的地址是:%p\np指向的内容是:%p\n", p, *p);
    printf("a的地址是:%p\na的内容是:%p\n", &a, a);
    system("pause");
}

打印结果:
这里写图片描述

C++ const 用法
说明1:与c语言不同,虽然指针p改变了a地址中的内容,但输出时候a的数值仍然是100
说明2:这种现象就是C++中的

“常量折叠”

,C++编译器进行语法分析的时候,将常量表达式计算求值, 并用求得的值来替换表达式,放入常量表,是

编译器的一种优化

因为编译器在优化的过程中,会把碰见的const全部以内容替换掉
(跟宏替换类似: #define PI 3.1415,用到PI时就用3.1415代替)
说明3:常量折叠发生在预编译阶段,在运行阶段,a的数据确实会被改变,可以单步调试查看内存看到。但读常量a时由于编译器的优化总是读到其初始化时候的数值。

下面的例子说明了编译器优化的存在,

#include <iostream>
using namespace std;

void main()
    {
        const int a = 100;
        cout << "a的数值是:" << a << "  a的地址是:" << &a << endl;
        int* p = (int*)&a;//c语言中数据类型强制转换方式
        cout << "p指向的内容是:" << *p << "  p的地址是:" << p << endl;
        *p = 200;
        cout << "p指向的内容是:" << *p << "  p的地址是:" << p << endl;
        cout << "a的数值是:" << a << "  a的地址是:" << &a << endl;
        int b = *(&a);
        cout << "b的数值是:" << b << endl;
        cout << "a的数值是:" << a << "  a的地址是:" << &a << endl;      
        int *e = (int*)(&a);
        cout << "e指向的内容是:" <<*e << endl;
        cout << "a的数值是:" << a << "  a的地址是:" << &a << endl;
        int* f = const_cast<int*>(&a);//c++中数据类型转换关键字之一const_cast
        cout << "f指向的内容是:" << *f << endl;
        cout << "a的数值是:" << a << "  a的地址是:" << &a << endl;
        cin.get();
    }

打印结果:
这里写图片描述

总结:常量折叠现象是C++编译器的一种优化,如果不想要编译器的这种优化,可以采用C++提供的关键字volatile

#include <iostream>
using namespace std;

void main()
{
    volatile  const int test = 100; 
    cout << test <<"  volatile  const 地址"<< &test<< endl;   
    int* p = (int*)(&test);
    *p = 200;   
    cout << test << "  volatile  const 地址" << &test << endl;
    cout << *p << "  指针p地址" << p << endl;

    cin.get();

}

打印结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值