c++中常量折叠

环境:VC6
代码1:
 
   
int main() { const int i=2 ; int* p=(int*)(& i); *p=100 ; cout<<"i的值为: "<<i<< endl; cout<<"指针指向的变量的值: "<<*p<< endl; cout<<"指针的值: "<<p<< endl; cout<<"i的地址: "<<&i<< endl; return 0 ; }

结果为:
2
100
0012FF7C
0012FF7C
---------------------------------------------

代码2:
 
   
int main() { const int& i=2; //加了个引用 int* p=(int*)(& i); *p=100 ; cout<<"i的值为: "<<i<< endl; cout<<"指针指向的变量的值: "<<*p<< endl; cout<<"指针的值: "<<p<< endl; cout<<"i的地址: "<<&i<< endl; return 0 ; }

结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------

代码3:
 
   
int main() { int a=2; //加了这句 const int i=a; //用a赋值 int* p=(int*)(& i); *p=100 ; cout<<"i的值为: "<<i<< endl; cout<<"指针指向的变量的值: "<<*p<< endl; cout<<"指针的值: "<<p<< endl; cout<<"i的地址: "<<&i<< endl; return 0 ; }

结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------

疑问:第一段代码指针p的值与i的地址一样,为什么改变不了i的值?
改变不了,但是为什么*p又能输出100?100又存在哪里?

第二段代码加个引用后,为什么就能改i的值了?到底发生了什么?
=================================================================================
常量折叠:

看一个例子:

int main(int argc, char* argv[])
{
const int i=0;
int *j = (int *) &i;
*j=1;
cout < <&i < <endlcout < <j < <endl;
cout < <i < <endl;
cout < <*j < <endl;
return 0;
}

结果是

0012ff7c
0012ff7c

0

1


因为i和j都指向相同的内存地址,所以输出的前两个结果是相同的,但为什么相同的内存里的结果不相同么?--这就是常量折叠.

这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
我只是改了这个地址内容,但是i还是0,


因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define PI 3.1415,用到PI时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
------------------------------------------------------------------------------------------
第二段从本质上来讲根第三段应该是一样的。

对于第二段,由编译器找了个位置将2存放起来了,相当于匿名变量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值