0. C++11四种存储数据方法:
- 自动储存持续性
在函数定义中声明的变量- 静态储存持续性
在函数定义外声明的变量
使用关键字static定义的变量- 线程储存持续性
- 动态储存持续性
使用new分配的内存
1. 自动储存持续性
在函数中声明的函数参数和变量。
储存性为自动,作用域为局部,没有链接性。
auto关键字
在C和早期C++中,auto用于显式地指出变量为局部自动变量。
自动变量和栈
程序留出一段内存,称为栈,管理自动变量的增减。
LIFO(后进先出)
register关键字
早期用于建议编译器使用CPU寄存器来储存自动变量。
C++中,只用来显示地指出变量是自动的(硬件和编译器的发展)。
2. 静态持续变量
3种链接性:
外部链接性(可在其他文件中访问)--> 在代码块外面声明
内部链接性(只能在当前文件中访问)--> 在代码块外部声明,并用static限定符
无链接性 --> 在代码块内部声明,并用static限定符
由于静态变量的数目在程序运行期间是不变的,因此不需要使用特殊装置(如栈)来管理它们。编译器将分配固定的内存块来储存所有的静态变量。
int global = 1000; // static duration, external linkage
static int one_file = 50; // static duration, internal linkage
int main()
{
...
}
void function(int n)
{
static int count = 0; // static duration, no linkage
}
// static 用于局部声明, 以指出变量是无链接性的静态变量时,
// static表示的是存储连续性;
// 而用于代码块外的声明时,变量已经是静态持续性了,
// static表示内部链接性。
// 有人称为关键字重载,即关键字的含义取决于上下文
静态变量初始化
1. 默认零初始化
2. 常量表达式初始化
3. 动态初始化
const double pi = 4.0 *atan(1.0); // dynamic initialization
//必须要等到atan被链接且被程序执行时初始化
静态持续性、外部链接性
(链接性为外部的变量通常简称为外部变量,它们的储存连续性为静态)
单定义规则:
在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字extern声明它。
附件:变量存储方式
储存描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
---|---|---|---|---|
自动 | 自动 | 代码块 | 无 | 在代码块中 |
静态,无链接性 | 静态 | 代码块 | 无 | 在代码中,使用static |
静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 |
静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用static |
网友评论