链接性:(链接性描述了名称如何在不同单元共享,也描述了名称的作用域)
链接性分为外部、内部、无链接性
外部链接性:可以在不同文件间共享
内部链接性:可以在整个文件间共享
无连接性:不能共享,只能在局部代码块使用
存储持续性:(持续性描述了变量的生存周期)
1、自动存储持续性:
在函数中定义的变量存储持续性为自动,在程序
开始调用其所属函数开始被创建,调用完毕被销毁,
在C++中有2种变量存储持续性为自动。
2、静态存储持续性:
在函数定义外定义的变量和使用用关键字static定义的
变量存储持续性为静态。它们在整个程序运行过程中
都一直存在C++中有3种存储持续性为静态的变量;
3、线程存储持续性(C++11):如果是用关键字
thread_local声明的变量,其生命周期与所属线程
一样长。
4、动态存储持续性:用new运算符分配空间后一直存在
直到调用delete函数之后被销毁。
存储持续性与链接性的关系
存储描述 | 持续性 | 链接性 | 作用域 | 声明方式 |
---|---|---|---|---|
自动 | 自动 | 无 | 代码块 | 在代码块中或者函数参数 |
寄存器 | 自动 | 无 | 代码块 | 在代码块中用关键字register |
静态无链接性 | 静态 | 无 | 代码块 | 在代码块中用关键字static |
静态外链连 | 静态 | 外链接 | 外部 | 在函数外 |
静态内链接 | 静态 | 内链接 | 内部 | 在函数外部用static |
注:
[1] register在C++11标注以前是用来声明寄存器变量的,用
register声明的变量会被存储在CPU寄存器内,加快访问速度,
对于某些访问量高的变量来说很适合。但是在C++11标准以后
register知识用来显示的指出变量是自动的,现在的编译器已经能
对使用频繁的变量做特殊处理了。
[2] auto,在C++11标注以前,auto关键字是用来显示的指出
某个变量为自动变量,和现在的现在的register和以前的auto
作用是一样的。但是在C++11标准以后auto被用来自动判断
变量的类型。
[3] static,在代码块中使用static关键字声明的变量存储持续性
为静态。在函数外用static关键字声明的变量链接性为内部。
[4] extern,想要在本文件中使用另一个文件中链接性为外部的变量
必须在本文件中使用关键字extern声明。
单定义规则:
该规则指出,变量只能定义一次,为了满足这种需求,C++
提供了两种变量的声明方式。一种是定义声明,简称为定义,
例如:int a,他会给变量分配内存空间。另一种是引用声明
,简称声明,例如:extern int a,它不会给变量分配内存空间
,只是告诉编译器有这么一个变量,且这是一个外部变量。