C++常量折叠
在复习C++过程中,遇到了“常量折叠”,突然很是困惑,清楚地记得当时的理解就是:可折叠的常量和宏一样。其实在慢慢写学习中,就会知道这样的理解未免有些片面。现在才真正的觉得,每次看的时候都会有不同的感受,我想知识的魅力就在于此。
当时的理解就可以用下面的程序看看:
#define PI 3.14
int main()
{
const int r = 10;
int p = pI; //这里会在预编译阶段产生宏替换,PI直接替换为3.14,其实就是int p = 3.14;
int len = 2*r; //这里会发生常量折叠,也就是对常量r的引用会替换成他对应的值,相当于int len = 2*10;
return 0;
}
上面的代码中,常量折叠表面上是和宏一样,只是在 “效果上一样”。区别就在于,宏是字符常量,在预编译完宏被替换,宏的名字就会消失;而发生常量折叠时,对常量的引用替换成常量值后, 该常量名没有消失,编译器会把它放在符号表中,为它分配内存空间。
为了验证上面所说,举例说明:
#define PI 3.14
int main()
{
//double* pi = Π //编译已经出现了错误:常量上的“&”
const int r = 10;
cout << r << endl;
int* pr = (int *)&r; //观察可折叠常量 是否有自己的内存
cout << *pr << endl;
*pr = 0; //是否能够修改
cout << *pr << endl;
double p = PI;
int len = 2 * r;
return 0;
}
运行结果:
说明了两点:
1、可折叠常量是有自己的内存空间的
2、可折叠常量的值不会改变
3、可以跟宏一样使用
总结:
常量折叠说的是,在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间,需澄清这点!!!
https://blog.csdn.net/My_heart_/article/details/51865865