C++ 常量折叠问题的理解

来源:互联网 发布:淘宝上的桃木 编辑:程序博客网 时间:2024/05/22 06:35

      在C++中,const变量(即常量)值放在编译器的符号表中,计算时编译器直接从表中取值,而不是访问内存,省去了访问内存的时间,这也就是所谓的编译器优化。

下面的代码可以很清晰的看出:

main.cpp

#include <iostream>using namespace std;int main(int argc,char** argv){/*volatile*/ const int i = 0;int *j = (int *) &i;*j = 1;cout<<"i:"<<i<<endl;cout<<"*j:"<<*j<<endl;cout<<"&i:"<<&i<<endl;cout<<"j:"<<j<<endl;cin.get();return 0;}

结果:

未加volatile:



而在C语言中,const是运行时const,编译时只是定义,运行时才会初始化,C语言中,const常量不可以作为数组的长度原因就是在此,在C语言中const变量在运行时改变是可以再次读出改变后的值的

而在C++中,const是编译时const,相当于#define定义的常量

注意:在C和C++中,const变量确实会被上面的代码所改变,但是C++在运行时改变const,再次读取的还是编译器符号表中的常量数据


那么怎么在C++中做到和C语言的情况呢?

C++中有一个volatile关键字,告诉编译器不要对这样的对象进行优化~

所以加上volatile之后,会强制从内存中取值

加volatile结果:


1 0
原创粉丝点击