现在的位置: 首页 > 综合 > 正文

const 可折叠常量和不可折叠常量

2019年03月25日 ⁄ 综合 ⁄ 共 679字 ⁄ 字号 评论关闭

根据网上总结的。

constant folding  一种编译优化技术。例如:2+2 应该在编译是就处理为4.


常量一般分为两种:可以常量折叠的常量不可以常量折叠的常量

常量折叠:在编译时期用常量的具体取值代替所有用到常量的地方。(就是编译优化后,对于常量数据,就没有对应的变量存在了,直接就是操作这个常量数值

对于不可以常量折叠的常量,编译器一定会为它分配空间的,因为它无法“常量折叠”,需要在程序运行时刻通过常量名字引用常量的具体值。
对于可以常量折叠的常量,编译器也不一定不为它分配空间(如果对X取地址或其他用到X存储空间相关的操作,那么X是分配储存空间),比如:
const int a = 4;
const int *pi = &a;
此处“取a的地址”,如果不对a进行内存分配,那a又怎么会有地址呢?


不可以常量折叠的常量的例子:

int test(){ return 8; }
const int a = test();//常量a不可以常量折叠
cout << a << endl;//由于a不可以常量折叠,所以经过编译器扫描之后仍然是“cout << a << endl;”

常量折叠的例子:
例如
const int a = 8;
cout << a << endl;
经过编译器扫描后,变为:
cout << 8 << endl;

又比如:
const int X = 5;
那么 Y = 2*X
在优化后是 2*5,  没有这个 X 的存在 ....

验证性文章:http://blog.csdn.net/yby4769250/article/details/7359278


抱歉!评论已关闭.