根据网上总结的。
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