const 可折叠常量和不可折叠常量
2013-12-21 17:25
176 查看
根据网上总结的。
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 的存在 ....
验证性文章:/article/2101632.html
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 的存在 ....
验证性文章:/article/2101632.html
相关文章推荐
- 字符串常量与const常量内存区(——选自陈皓的博客)
- C++11特有的数值、数组初始化方法、常量的符号名称 const和浮点数、bool、自动推断类型auto
- C++编译器如何对Const常量进行分配存储空间
- 常量(const)
- php const 用法详解 定义 常量
- 对于const常量定义在头文件的思考
- 静态常量和动态常量的问题(Const、Static、Readonly)
- define宏定义和const常量定义之间的区别
- C++ Special:const关键字和常量指针 vs 指针常量
- Objective-C中const常量是外连接的
- iOS 宏(define)与常量(const)的正确使用
- C/C++中define定义的常量与const常量
- // 程序员面试宝典 62页 ,指针,引用,const常量定以后立即初始化。
- C++类静态成员变量和const常量的初始化方法
- C# 常量关键字const
- iOS 宏(define)与常量(const)的正确使用
- 条款2:运行时常量(readonly)优于编译时常量(const)
- PHP常量深入学习 define和const的区别
- Java之常量折叠
- const_cast函数将常量变成非常量,保护现场