cpp使用三种(在cpp11中是四种)不同的方案来存储数,这些方案的区别在于数据保留在内存中的时间。
-
自动存储持续性:
在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码时被创建,在执行完函数或代码块时,它们使用的内存被释放。cpp有两种存储持续性为自动的变量。自动变量存放在栈中。程序使用两个指针来跟踪栈,一个指针指向栈底——栈的开始位置,另一个指针指向堆顶——下一个可用内存单元。当函数被调用时,其自动变量将被加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。
-
静态存储持续性:
在函数定义外定义的变量 和 使用关键字static
定义的变量 的存储持续性都为静态。它们在程序整个运行过程中都存在。未被初始化的静态变量的所有位都被设置为0。-
cpp为静态存储持续性提供了3种链接性:
① 外部链接性(可在其他文件中访问)
② 内部链接性(只能在当前文件中访问)
③ 无链接性(只能在当前函数或代码块中访问)... int global = 1000; // 外部链接性 static int one_file = 50; // 内部链接性 int main(){ ... } void funct1(int n){ static int count = 0; // 无链接性 int llama= 0; ... }
-
单定义规则:
变量只能定义一次!在每个使用外部变量(链接性为外部的变量)的文件中,都必须声明该外部变量。因此cpp提供了两种变量声明,一种是定义声明,简称定义,它给变量分配存储空间;另一种是引用声明,简称声明,它不给变量分配存储空间,因为它引用已有的变量。 引用声明使用关键字extern
,且不进行初始化;否则,声明为定义,导致分配存储空间。因此,在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字
extern
声明它。// file01.cpp extern int cats = 20; // definition int dogs = 22; // definition int fleas; // definition // file02.cpp // use cats and dogs from file01.cpp extern int cats; extern int dogs; // file98.cpp // use cats, dogs and fleas from file01.cpp extern int cats; extern int dogs; extern int fleas;
-
无连接性
在代码块中使用static时,将导致局部变量的存储持续性为静态的。这意味着虽然该变量只在该代码块中可用,但它在该代码块不处于活动状态时仍然存在。因此在两次函数调用之间,静态局部变量的值将保持不变。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。 -
const
对默认存储类型的影响
在cpp中,const限定符对默认存储类型稍有影响。在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的。也就是说,在cpp看来,全局const定义就像使用了static说明符一样。若希望某个常量的链接性为外部的,则可以使用extern关键字来覆盖默认的内部链接性。在这种情况下,必须在所有使用该常量的文件中使用exterm关键字来声明它。这与常规外部变量不同,定义常规外部变量时,不必使用 extern 关键字,但在使用该变量的其他文件中必须使用extern。
extern const int states = 50;
-
-
线程存储持续性(cpp11):
当前,多核处理器很常见。这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local
声明的,则其生命周期与所属的线程一样长。 -
动态存储持续性:
用new
运算符分配的内存将一直存在,直到使用delete
运算符将其释放或程序结束为止。这种内在的存储持续性为动态,有时被称为自由存储(free store)或堆(heap)。