修改const变量,与编译器优化问题

普通const变量在C++中为不可修改的;但是只是在编译器编译的过程中会有提示;

通过地址间接进行修改const的值会怎样?

    const long i1 = 5;
    long i2 = 10;
    long i3 = 20;
    long *i4 = &i2;
    i4 = i4 - 8;
    *i4 = 9;

这样改,编译器会报错吗?
不会。编译器编译通过,并且能正常跑。
那么,问题来了,i1的值会变成9吗?来cout一下:

    std::cout << i1 << ", " << &i1 << std::endl;
    std::cout << i2 << ", " << &i2 << std::endl;
    std::cout << i3 << ", " << &i3 << std::endl;
    std::cout << *i4 << ", " << i4 << std::endl;

要不就是i1更改失败,i1 == *i4 == 5,要不就是i1更改成功,i1 == i4 == 9?
并不是:
在这里插入图片描述
那么,为什么,i1的值没变,但是
i4的值变了呢???去看一眼VS的优化选项:
在这里插入图片描述
已经禁用优化了啊?
原因到底在哪里呢???
再看一下反汇编代码:
在这里插入图片描述
在std::cout<<i1的时候,直接用常量数字5写进代码了。
这叫没有优化=.=

写完发现有C语言中const变量修改以及优化问题已经说明过了,可以加volatile让编译器强行去内在取值。

所以const只是依赖于编译器的实现。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值