c++中的常量折叠 http://blog.csdn.net/yafeng_jiang/article/details/7101964

来源:互联网 发布:vmware14安装ubuntu 编辑:程序博客网 时间:2024/06/05 14:24

标签: c++编译器优化googlec
 1459人阅读 评论(0) 收藏 举报
 分类:
 

        先来看一个例子:

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main() {  
  4.     const int a=9;  
  5.   
  6.     int *p=(int*)&a;  
  7.     *p=10;  
  8.       
  9.     printf("%p %p\n", &a, p);       //0012FF7C 0012FF7C  
  10.     printf("a: %d , *p %d\n",a,*p); //a: 9 ,*p: 10  
  11.       
  12.     return 0;  
  13. }  

        由例子的结果发现:&a,p是同一块地址,但它们的输出结果却不相同。

        这就是编译器的”常量折叠”在作怪啦!

        "常量折叠"就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。

        编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏替换似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!

        如果不想要编译器的这种优化就要用到volatile关键字啦。

[cpp] view plain copy
  1. const int a=9;  

修改为:

[cpp] view plain copy
  1. volatile const int a=9;  

即可。

        另外const在c   c++中还有一定的差别,有兴趣的朋友可以google一下。
0 0