C++可使用三/四种方案来存储数据;这些方案的区别在于数据保留在内存中的时间。
- 自动存储持续性: 函数定义中声明的变量(包括函数参数)为自动的。在程序开始执行其所属的函数或代码块时被创建,在执行完其所属函数或代码块时,它们使用的内存被释放。 C++有2种存储持续特性为自动的变量
- 静态存储持续性: 在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。它们在程序整个运行过程中都存在。 C++有3种存储持续特性为静态的变量。
- 线程存储持续性:多核处理器(CPU)可以同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程周期一样长。
- 动态存储持续性: 用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续特性为动态,有时被称为自由存储(free store)或堆(heap)。
下面介绍关于各种变量何时在作用域内可见/可被程序使用,以及连接性。链接性决定了哪些信息可以在文件间共享
作用域
作用域(scope)描述了名称在文件(翻译单元)的多大范围内可见。例如函数中定义的变量只在该函数中可见,其他函数中不可见。
作用域分类
- 作用域为局部的变量只在定义它的代码块{}中可用。
- 作用域为全局的(文件作用域)在定义位置到文件结尾都可用
- 自动变量作用域为局部,静态变量作用域是全局还是局部取决于它是怎么被定义的
- 在函数原型作用域(function prototype scope)中使用的名称只在包含参数列表的括号内可用,这也就是为什么它们可以省略的原因。
- 在类中声明的成员的作用域为整个类
- 在名空间中声明的变量的作用域为整个名称空间,全局作用域是名称空间作用域的特例
C++函数的作用域可以是整个类或整个名称空间,但不能是局部的,(因为不能在代码块内定义函数,如果函数的作用域为局部,则只对它自己是可见的,因此不能被其他函数调用,这样的函数将无法运行)。
链接
链接性(linkage)描述了名称如何在不同单元间共享。链接性为外部的名称可在文件间共享,链接性为内部的名称只能由一个文件中的函数共享。自动变量的名称没有链接性,因为他们不能共享。
不同的c++存储方式是通过存储持续性、作用域和链接性来描述的。
可使用外部变量在多文件程序的不同文件间共享数据;
可使用链接性为内部的静态变量在同一文件的多个函数之间共享数据;
如果将作用域为整个文件的变量变为静态的,就不必担心它与其他文件中的作用域为整个文件的变量发生冲突了
在代码块中使用static时,将局部变量变为静态,这样该变量只在代码块中可用,但它在该代码块不处于活动状态时仍然存在,因此在两次函数调用之间,静态局部变量的值将保持不变。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化