一、文章来由

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具体解释(二) 常量折叠的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. 高级进阶DB2(第2版)——内部结构、高级管理与问题诊断

    <高级进阶DB2(第2版)——内部结构.高级管理与问题诊断> 基本信息 作者: 牛新庄    出版社:清华大学出版社 ISBN:9787302323839 上架时间:2013-7-3 出版 ...

  3. MEF高级进阶

    MEF高级进阶   好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四 ...

  4. .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?

    本文将通过场景例子演示,来通俗易懂的讲解在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码. 通过一系列优化最终达到两个效果,1.通过代码块来控制事务(分布式事务),2.通过委托优化Tran ...

  5. [总]Android高级进阶之路

    个人Android高级进阶之路,目前按照这个目录执行,执行完毕再做扩展!!!!! 一.View的绘制 1)setContentView()的源码分析 2)SnackBar的源码分析 3)利用decor ...

  6. 高级进阶DB2(第2版)

    <高级进阶DB2(第2版)> 基本信息 作者: 牛新庄 出版社:清华大学出版社 ISBN:9787302323839 上架时间:2013-7-3 出版日期:2013 年7月 开本:16开 ...

  7. Django笔记 —— 模板高级进阶

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  8. 6.MySQL优化---高级进阶之表的设计及优化

    转自互联网整理. 优化之路高级进阶——表的设计及优化 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规 ...

  9. openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)

    openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二)    ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.t ...

随机推荐

  1. foreach 与 Linq的 Select 效率问题

    Resharper 是一个非常强大的C#编程辅助工具,有着非常强的提示功能,代码纠正,代码简化等等 在编码过程中注意到这么一件事,可能是大家经常会遇到的: 遍历某个集合,然后经过处理生成另外一个集合, ...

  2. C3P0连接池一些基本配置

    C3P0连接池配置 数据库连接是一个耗费大量资源且相当慢的操作,所以为了提高性能和连接速度,诞生了连接池这样的概念. 在多用户并发操作过程中,连接池尤为重要. 它是将那些已连接的数据库连接存放在一个容 ...

  3. F - 等式(1/x + 1/y = 1/n)

    链接:https://www.nowcoder.com/acm/contest/90/F来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整 ...

  4. django实现动态菜单的方式

    1.model from django.contrib.auth.models import User #django自带 class UserProfile(models.Model): " ...

  5. [jquery] ajax 调试

    $.ajax({ type: ‘post’, url: url, data: {code: ‘15′}, dataType: ‘jsonp’, sccuess:function(data){ aler ...

  6. 高效mysql的习惯(程序员版本)

    高效的mysql 一定要有主键 如果没有主键: 数据多次读写后可能更离散,有更多随机I/O MySQL复制环境中,如果选择RBR模式,没有主键的update需要读全表,导致复制延迟 好的主键特点: 没 ...

  7. hdu2665(主席树模板题)

    hdu2665 题意 求区间第 k 小. 分析 参考 这类题目做法挺多的,例如 划分树. 这里使用主席树再写一发,不得不说主席树相比而言要好写的多,比起普通线段树,主席树就是复用了线段树共有的信息. ...

  8. Linux命令之crontab

    crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] crontab命令被用来提交和管理用户需要周期性执行的任务,与win ...

  9. centos7常用系统维护命令

    一.开机自启动服务列表 #开机自启动 apache服务 systemctl enable httpd.service #开机自启动iptables服务 systemctl enable iptable ...

  10. CodeForces - 981E Addition on Segments

    考虑每个点i在什么情况下会成为最大值. 当选的区间子集是 包含i的区间的一个子集的时候,i肯定会是最大值. 所以我们就可以用这种方法得到所有点的可能的最大值是多少... 也就是说,最后的局面可以仅由一 ...