环境:VC6
代码1:
结果为:
2
100
0012FF7C
0012FF7C
---------------------------------------------
代码2:
结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------
代码3:
结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------
疑问:第一段代码指针p的值与i的地址一样,为什么改变不了i的值?
改变不了,但是为什么*p又能输出100?100又存在哪里?
第二段代码加个引用后,为什么就能改i的值了?到底发生了什么?
代码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代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
------------------------------------------------------------------------------------------
看一个例子:
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存放起来了,相当于匿名变量。
对于第二段,由编译器找了个位置将2存放起来了,相当于匿名变量。
本文通过三个C++代码示例详细探讨了常量、指针及常量引用的行为特性,揭示了编译优化对程序行为的影响,特别是针对常量的折叠优化过程及其对运行时的影响。
2059

被折叠的 条评论
为什么被折叠?



