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

 

posted @ 2023-06-14 21:50  imxiangzi  阅读(22)  评论(0编辑  收藏  举报