博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++高级进阶 第四季:const具体解释(二) 常量折叠
阅读量:5812 次
发布时间:2019-06-18

本文共 1250 字,大约阅读时间需要 4 分钟。

一、文章来由

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 仅在被定义过的文件里才可见,而在连接时不能被其它看到。

可是在c中只在还有一个文件里定义(不用extern修饰),还有一个文件也是合法的。c中const是必需分配内存的,而c++实际上一開始是不会分配内存的,不过存在字符表中。

//another.cconst int a = 5;//other.c#include 
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<<

由于extern不是定义的一部分,所以个人觉得这也不会分配空间。

五、为什么const要内部连接

当然想绝对不为不论什么const分配存储是不可能的,尤其是复杂的结构。所以const的定义必须默认内部连接,即连接仅在特定的编译单元内;否则。由于众多的const在多个cpp文件分配内存,引起连接错误。

连接程序在多个对象文件看到统一的定义就会“抱怨”。

然而,由于const默认内部连接,所以连接程序不会跨过编译单元连接那些定义,因此不会有冲突。


參考资料

[1] c++编程思想

[2]

你可能感兴趣的文章
ndk制作so库,ndk-build不是内部或外部命令。。。的错误
查看>>
Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
查看>>
ORM数据库框架 SQLite 常用数据库框架比较 MD
查看>>
BNU 34990 Justice String (hash+二分求LCP)
查看>>
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
jquery画图插件jPainter
查看>>
真正努力的人,从来不焦虑
查看>>
Lua语言特色
查看>>
C# 单机Window 程序 sqlite 数据库实现
查看>>
JavaScript一些函数
查看>>
国务院关于积极推进“互联网+”行动的指导意见
查看>>
Matrix Factorization, Algorithms, Applications, and Avaliable packages
查看>>
图像配准转换
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>