C++存储类型·(auto,static,register,extern)
从变量值存在的角度来分,可以分为静态存储方式和动态存储方式。
静态存储方式;指在程序运行期间由系统分配固定的存储空间的方式(程序开始执行时分配,在程序执行完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放)。
动态存储方式;在运行期间根据需要进行动态存储方式(在程序过程中申请和释放的一些空间)。
内存中供用户使用的存储空间分为:程序区、静态存储区和动态存储区。程序放在程序区,数据放在静态存储区和动态存储区。在动态存储区存放函数形式参数、自动变量(未加static声明的局部变量)和函数调用时的现场保护和返回地址。
在C++面向对象设计中,由于类具有封装性,所有类中的成员均不能使用extern,auto,register
1.自动变量(auto)
函数中的局部变量,动态的分配存储空间,数据存储在动态存储区(栈区)中。在调用函数时,系统会自动的给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此,这类局部变量成为自动变量,用关键字auto作为存储类别的声明。
/*
anto 自动的,类型根据初值被推导出来 因此必须初始化
*/
auto i=45; //i has a type named int
double f();
auto b=f(); //b has a type named double
2、静态变量(static)
static关键字修饰的变量称为静态变量。
static修饰局部变量
static修饰局部变量时,改变了它的存储区域——存储在静态区,使得该变量的生命周期发生了变化:该变量不随函数调用结束而释放,只要程序还在运行,都不释放;但没有改变其作用域,该变量还是只能在定义该变量的域内部使用,不能被其它函数调用
静态局部变量是在编译时赋初值的,所以只赋初值一次,在程序运行期间它已有初值,每次调用函数时不再重新赋值而是保留上次调用结束时的值。如果在定义静态局部变量时不赋初值的话,编译时会自动赋初值0或空字符‘\0’。
而对局部变量来说,实在函数调用时赋初值的,所以每次调用都重新定义且赋初值一次。如果自动变量不赋初值的话,它的值是一个随机值。
static修饰全局变量
全局变量都是存放在静态存储区的,它们的生命周期是程序的整个过程,作用域是从定义该全局变量的开始到文件结束。当全局变量被static修饰时,该变量就不能被其它文件所使用,表示该变量仅作用于本模块。改变了该变量的连接属性,从外部链接变成了内部链接。
一般情况下,变量的值是存放在内存中的。当程序中用到那个变量时,由控制器发出指令将内存中的数据送到运算器中。通过运算器进行运算,如果需要存数,再从运算器将数据运到内存中存放。
如果有一些变量使用频繁,则为存取变量的值要花不少时间,为提高CPU的执行效率,编译器会将这些经常使用的局部变量的值放在CPU的寄存器中,寄存器的存取速度远高于内存的存取速度,这样就提高了执行效率。这样,这样被存放在寄存器中的变量叫做寄存器变量,用关键字register声明。
register int a;//声明寄存器变量
现在,编译器可以总动识别使用频繁的变量,会自动将它优化进寄存器中,不需要程序员声明。
使用extern扩展作用域!
用来声明外部变量和外部函数(和static一种用法相对),extern只是声明而不是定义
- 在一个文件内部扩展作用域
表示变量的定义在当前引用的后面
在定义点之前的函数要想使用该外部变量,则应该在引用前,用extern对该变量做外部变量声明,表示把外部变量的作用域扩展到此位置。
2.多文件中声明外部变量
表示该变量定义在文件外部