[C++ 学习] 常量折叠

转载自 http://www.cnblogs.com/chenyuming507950417/

 

所谓 "常量折叠",就是 const 类型的变量,在使用这个变量的时候,无视这快内存内容是什么,

而是直接使用这个变量最开始的初始值.

 

下面是转载的内容 :

 

 

今天意外见识了这个名词是在CSDN帖子里http://topic.csdn.net/u/20120406/03/f59790a9-67b8-479c-9f43-9bc413fae761.html?95101

      其实这个困惑早就出现了,记得最早是看到了这篇文章http://www.cnblogs.com/wenzhang/archive/2011/12/30/2308052.html,当时还请教了作者,但始终没有说服自己的理由,今天 再看到确实有种乞重见老朋友的感觉,所以就上网搜搜这方面的帖子了。

       首先来看一个简单的例子吧:

#include <iostream>
using namespace std;

int main()
{
    const int a=6;//const修饰必须初始化
    int *p=(int*)&a;
    *p=8;

    cout<<"a的地址为:"<<&a<<"\t"<<"a的值为:"<<a<<endl;
    cout<<"p的地址为:"<<p<<"\t"<<"p指向变量的值为:"<<*p<<endl;

    return 0;
}

运行结果:

a的地址为:0012FF7C       a的值为:6
p的地址为:0012FF7C       p指向变量的值为:8

一个内存地址竟然同时存两个值,有点诧异。这就牵涉到了常量折叠。

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

      在编译器的优化的过程中,会把用const修饰的变量以内容替换掉,如宏似的:#define pi 3.14,当然这种是出现在预编译阶段,在运行阶段时,它的内存里的内容是可以改变的。

     对于const int a=6,可能有如此疑问:a是什么,存在哪里,6又是什么,存在哪里?我不会将a看作常量,我更愿称之为用const修饰的变量。所谓变,我只的是其代表内存中所存的内容会变,要用a与一般变量有什么不同,无非就是被const修饰了。那么被const修饰了又是什么意思呢,如:const int a=6,其实这个语句是对a的声明,编译器一开始就知道a的,a是一个符号,放在符号表中,其代替了6,也就是说6也可以看作是一种符号,所以a就是6,6就是a,当然是相对来说的。相当6还是不同于 a的,6是文字常量,字面常量。那么6存在哪呢,其实管它在哪呢,因为它毕竟是不能存址的。

可以说,c++里的常量折叠(或者常量替换)是将const常量放在符号表中,而并不给其分配内存。编译器直接进行替换优化。


参考:

(1)http://www.cppblog.com/xmli/archive/2010/11/23/134425.html

(2)http://topic.csdn.net/u/20071016/13/4617d907-23ac-489e-81dc-90a80b118f0b.html

    

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值