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、可以跟宏一样使用


总结:

常量折叠说的是,在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间,需澄清这点!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值