C++高级进阶 第四季:const具体解释(二) 常量折叠
一、文章来由
const具体解释之二
二、const 取代 #define
const最初动机就是取代 #define。
const 优于 #define:
(1) #define没有类型检查,const在编译期(而不是预编译期)做类型检查。
(2)const方便调试和定位bug。
所以应该全然用const取代#define
三、头文件里的const
(1)要使用const取代#define。相同须要把const定义放进头文件(或其它格式文件,include就可以)。
这样通过包括头文件。可把const定义单独放在一个地方并把它分配给一个编程单元。
(2)C++中的const默觉得内部连接(internal linkage),也就是说 const 仅在被定义过的文件里才可见,而在连接时不能被其它
url=Lo9O57v2QfNPo448tsFG0ohDjltQti7bZzkVdj5AZfTf0UmOpLWtCxRIS8IHzjonYh1CBOZ1M4XyNtjylIkzU_">编译单元
看到。
可是在c中只在还有一个文件里定义(不用extern修饰),还有一个文件也是合法的。c中const是必需分配内存的,而c++实际上一開始是不会分配内存的,不过存在字符表中。
//another.c
const int a = 5;
//other.c
#include <stdio.h>
int main()
{
extern const int a;
printf("%d\n",a);
return 0;
}
(3)定义一个const时。必须赋一个值给它,除非用extern做说明:extern const int bufsize;
四、常量折叠(constant folding)
通常C++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里,但extern强制进行了存储空间分配。取const地址也会**,这也解释了const具体解释(一)中可以改动const空间。可是cout原值相当于还是去符号表中找。
由于extern意味着使用外部连接(定义时使用extern),因此必须分配存储空间,这也就是说有几个不同的编译单元应当可以引用它,所以必须有存储空间。
通常情况下,当extern不是定义的一部分时,不会分配存储空间。假设使用const,那么编译时会进行常量折叠。
那同文件extern呢
extern const int a;
int main()
{
//freopen("input.txt","r",stdin);
cout<<a<<endl;
return 0;
}
const int a = 66;
由于extern不是定义的一部分,所以个人觉得这也不会分配空间。
五、为什么const要内部连接
当然想绝对不为不论什么const分配存储是不可能的,尤其是复杂的结构。所以const的定义必须默认内部连接,即连接仅在特定的编译单元内;否则。由于众多的const在多个cpp文件分配内存,引起连接错误。
连接程序在多个对象文件看到统一的定义就会“抱怨”。
然而,由于const默认内部连接,所以连接程序不会跨过编译单元连接那些定义,因此不会有冲突。
參考资料
[1] c++编程思想
[2] http://blog.csdn.net/bestrivenfan/article/details/50951809
C++高级进阶 第四季:const具体解释(二) 常量折叠的更多相关文章
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 高级进阶DB2(第2版)——内部结构、高级管理与问题诊断
<高级进阶DB2(第2版)——内部结构.高级管理与问题诊断> 基本信息 作者: 牛新庄 出版社:清华大学出版社 ISBN:9787302323839 上架时间:2013-7-3 出版 ...
- MEF高级进阶
MEF高级进阶 好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四 ...
- .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?
本文将通过场景例子演示,来通俗易懂的讲解在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码. 通过一系列优化最终达到两个效果,1.通过代码块来控制事务(分布式事务),2.通过委托优化Tran ...
- [总]Android高级进阶之路
个人Android高级进阶之路,目前按照这个目录执行,执行完毕再做扩展!!!!! 一.View的绘制 1)setContentView()的源码分析 2)SnackBar的源码分析 3)利用decor ...
- 高级进阶DB2(第2版)
<高级进阶DB2(第2版)> 基本信息 作者: 牛新庄 出版社:清华大学出版社 ISBN:9787302323839 上架时间:2013-7-3 出版日期:2013 年7月 开本:16开 ...
- Django笔记 —— 模板高级进阶
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- 6.MySQL优化---高级进阶之表的设计及优化
转自互联网整理. 优化之路高级进阶——表的设计及优化 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规 ...
- openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)
openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二) ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.t ...
随机推荐
- Jquery获取服务器端控件的三种方式
一 Jquery获得服务器控件值的方法由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<as ...
- [转]认识session
今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下: session是服务器端的一种会话机制,当客户端的请求服务器创建一个sessi ...
- HBASE启动失败,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster
Master日志错误:2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.R ...
- 最小生成树(Kruskal)(并查集)
最小生成树 时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 2[提交][状态][讨论版] 题目描述 某个宇宙帝国有N个星球,由于宇宙的空间是三维的,因此每个星球的位置可以用三维 ...
- 【点分治】bzoj2152 聪聪可可
模板题. #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> ...
- 1.3(学习笔记)JSP(Java Server Pages)内置对象
一.内置对象 内置对象又称内建对象.隐式对象,是由服务器自动创建实例化的, 用户在使用时不需要显示的创建,可直接使用. jsp内置对象名称,类型及作用域 Scope代表该内置对象的作用范围,page表 ...
- N进制加法
我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16 ...
- CHBTC
蛙人高频交易拆单策略-带手续费拆单策略及原理说明 - 王宇 warensoft - 博客园 CHBTC
- gns3 接口说明 转
Dynamips 支持的模块首先从C7200 开始Slot 0:C7200-IO-FE <------> 支持1 个Fastethernet 接口C7200-IO-2FE <---- ...
- u-boot支持LCD显示(基于TQ2440)
平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB NandFlash:256MB) 作者:彭东林 邮箱:pengdo ...