C++ 常量折叠
来源:互联网 发布:高并发网络架构 编辑:程序博客网 时间:2024/05/15 22:51
c 中const 常量用法
说明:c语言中const 常量可以很容易地被改变
#include <stdio.h>#include <stdlib.h>void main(){ const int a = 100; printf("a的地址是:%p\na的内容是:%p\n", &a, a); int* p = (int*)&a; printf("p的地址是:%p\np指向的内容是:%p\n", p,*p); *p = 200; printf("p的地址是:%p\np指向的内容是:%p\n", p, *p); printf("a的地址是:%p\na的内容是:%p\n", &a, a); system("pause");}
打印结果:
C++ const 用法
说明1:与c语言不同,虽然指针p改变了a地址中的内容,但输出时候a的数值仍然是100
说明2:这种现象就是C++中的
“常量折叠”
,C++编译器进行语法分析的时候,将常量表达式计算求值, 并用求得的值来替换表达式,放入常量表,是
编译器的一种优化
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉
(跟宏替换类似: #define PI 3.1415,用到PI时就用3.1415代替)
说明3:常量折叠发生在预编译阶段,在运行阶段,a的数据确实会被改变,可以单步调试查看内存看到。但读常量a时由于编译器的优化总是读到其初始化时候的数值。
下面的例子说明了编译器优化的存在,
#include <iostream>using namespace std;void main() { const int a = 100; cout << "a的数值是:" << a << " a的地址是:" << &a << endl; int* p = (int*)&a;//c语言中数据类型强制转换方式 cout << "p指向的内容是:" << *p << " p的地址是:" << p << endl; *p = 200; cout << "p指向的内容是:" << *p << " p的地址是:" << p << endl; cout << "a的数值是:" << a << " a的地址是:" << &a << endl; int b = *(&a); cout << "b的数值是:" << b << endl; cout << "a的数值是:" << a << " a的地址是:" << &a << endl; int *e = (int*)(&a); cout << "e指向的内容是:" <<*e << endl; cout << "a的数值是:" << a << " a的地址是:" << &a << endl; int* f = const_cast<int*>(&a);//c++中数据类型转换关键字之一const_cast cout << "f指向的内容是:" << *f << endl; cout << "a的数值是:" << a << " a的地址是:" << &a << endl; cin.get(); }
打印结果:
总结:常量折叠现象是C++编译器的一种优化,如果不想要编译器的这种优化,可以采用C++提供的关键字volatile
#include <iostream>using namespace std;void main(){ volatile const int test = 100; cout << test <<" volatile const 地址"<< &test<< endl; int* p = (int*)(&test); *p = 200; cout << test << " volatile const 地址" << &test << endl; cout << *p << " 指针p地址" << p << endl; cin.get();}
打印结果:
0 0
- C++const/常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- 常量折叠
- C++ 常量折叠和C语言中const常量对比
- c++常量折叠(常量替换)
- 升级到VS2013常见问题
- StringBuffer
- 1238 -- 潇潇的烦恼
- 程序设计作业报告模板
- @property中有哪些属性关键字
- C++ 常量折叠
- 六大设计原则
- My first blog
- 客户端总体设计方案分享
- 1239 -- 抓牌
- 使用HIVE的WEB界面:HWI
- Hessian初步使用(配合spring)
- myeclipse规范格式快捷键
- 关于js跳转页面传值乱码的解决方案