存储类型与标识符的生命期

来源:互联网 发布:ie11不支持js 编辑:程序博客网 时间:2024/05/21 22:31

存储类型(storage class)决定标识符的存储区域,即编译器在不同区域为不同存储类型的标识符分配空间。由于存储区域不同,标识符的生命周期也不同,生命期是指标识符从获得空间到空间被释放之间的时间,标识符只有在生命期中,并且在其自己的作用域中才能被访问。
C++中存储类型说明符有4个:auto、register、static、extern
auto和register修饰的为自动存储类型,static修饰静态存储类型,extern声明外部存储类型。
    1.自动存储类型包括自动变量和寄存器变量,
    局部变量都是自动变量,生命期开始于块的执行,结束于块的结束,原因是自动变量的空间分配在栈中,块开始执行时系统自动分配空间,块执行结束时系统自动释放空间,因此自动变量的生命和作用域是一致的。
    寄存器变量register int i;系统将使用这种说明的变量尽可能保存在寄存器中,以提高程序运行速度。
    2.静态存储类型
    static声明的变量,根据定义的位置不同,还可以分为局部静态变量和全局静态变量,静态变量均存储于全局数据区,如果程序未显式的给出初始化值,则等效初始化为0,静态变量占有的空间要等到整个程序执行结束时才释放,因此静态变量具有全局生命周期。
    局部静态变量是定义在块中的静态变量,编译器在全局数据区为其开辟存储空间,该空间一直知道整个程序结束才释放,局部静态变量具有局部作用域,但却有全局生命期,如果显式给出初始化值,则在该块第一次执行时完成,且只进行一次。
    example:auto_static_variable  
    3.外部存储类型
    一个C++程序可以由多个源程序文件组成,多文件程序系统可以通过外部存储类型的变量和函数共享某些数据和操作。(例如,main.cpp include mySort.h)
    在一个程序文件中定义的全局变量和函数默认为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果想使用这个文件中定义的全局变量和函数,需要使用前extern声明,表示该文件不是在本文件中定义的。外部声明通常放在文件的开头(extern 通常省略)
生命期:
(life time)生命期与存储结构相关,存储区域分为代码区,全局数据区,栈区,自由存储区,相应的,生命期分为静态生命期,局部生命期和动态生命期。    
静态生命期指的是标识符从程序开始运行时就存在,切到程序结束时消亡,释放空间。具有静态生命期的标识符放在全局数据区,如全局变量,静态全局变量和局部静态变量。默认初始化为0;
局部生命期:函数内部或块中定义的标识符,生命期始于执行到该函数或块的标识符定义处,结束于函数结束,具有局部生命期的标识符存放在栈中,局部生命期的标识符如果未被初始化,不能引用。
动态生命期:具有动态生命期的标识符存放在自由存储区,由特定的函数调用或运算来创建和释放。new(),malloc()为变量分配存储空间时,变量的生命期开始,delete(),free()释放空间或程序结束时,变量生命结束。

0 0
原创粉丝点击