【第22期】观点:IT 行业加班,到底有没有价值?

常量叠算(Constant folding),还是叫常量合并更合适点,呵呵

原创 2007年09月26日 15:21:00

今天刚学到,以此为记。

先看一个例子:

const int c=111;
int& r=const_cast<int&>(c);
int* p=const_cast<int*>(&c);
cout<<"const [<<&c<<"]"<<c<<endl;
cout<<"refer [<<&r<<"]"<<r<<endl;
cout<<"point [<<p<<"]"<<*p<<endl;
r=222;

cout<<"after:"<<endl;
cout<<"const [<<&c<<"]"<<c<<endl;
cout<<"refer [<<&r<<"]"<<r<<endl;
cout<<"point [<<p<<"]"<<*p<<endl;


 答案如下:

const [0xbfff5614]111
refer [0xbfff5614]111
point [0xbfff5614]111
after:
const [0xbfff5614]111
refer [0xbfff5614]222
point [0xbfff5614]222

常量叠算(Constant   folding)是一个编译器的优化技巧, 指在编译时就对常量表达式进行预求值。 

比如上面小懒虫虫说的const int c = 1;常量折叠并不对a分配存储空间,而是把c = 1;保存到符号表里,

在用到c时,会根据符号表把c替换成1。想要不进行常量折叠,加extern就行了,即extern const int c = 1;不过c没有定义的话,加了extern也不能分配存储空间,还是要进行所谓的常量折叠。

如果整个程序中没有用到常量的地址的话,那么很有可能编译器不会为该常量分配空间。

比如表达式  array[ MAXSIZE + 1]   //#define   MAXSIZE 10    

在编译之后便被当作   array[11],这样有利于提高运行时性能并减少目标代码尺寸。   

这种优化通常仅适用于内置的数值,布尔类型。

 

所以上面的代码实际上变成了

const int c=111;
int& r=const_cast<int&>(c);

cout<<"const [<<&c<<"]"<<111<<endl;
cout<<"refer [<<&r<<"]"<<r<<endl;
cout<<"point [<<p<<"]"<<*p<<endl;
r=222;
cout<<"after:"<<endl;
cout<<"const [<<&c<<"]"<<111<<endl;
cout<<"refer [<<&r<<"]"<<r<<endl;
cout<<"point [<<p<<"]"<<*p<<endl;

 

像这种表达式也在合并范围之内

for(int   i=0;i<100*200*300;i++){   
      ......   
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

堆栈计算机的原理和实现

堆栈计算机的原理和实现 原书《 Stack Computers: the new wave 》 (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这是第一本讨论...
  • wxj729
  • wxj729
  • 2005-03-07 16:31
  • 14129

struts2 常用的常量介绍<constant

//指定默认编码集,作用于 HttpServletRequest的setCharacterEncoding方法和freemarker,velocity的输出 <p style="margin-top: 0px; margi

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

超全的英语短句汇集

English 900 英语九百句常用职位英文译名超级短句成语集锦打开话匣子PC电脑词汇一百个绝佳句型李阳英语365句托福听力常用短语校园英语迷你惯用语洋话连篇至理名言English 900 英语九百...

如何在Java中定义常量(Constant)

首先看示例: /** * Method One */ interface ConstantInterface { String SUNDAY = "SUNDAY"; String MONDAY = "MONDAY"; String TU...

常量折叠 Constant folding

常量折叠:在编译时期用常量的具体取值代替所有用到常量的地方。 例如 const int a = 8; cout  经过编译器扫描后,变为: cout  常量一般分为两种:可以常量折叠的常量和不可以常...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)