存储类型
变量的存储类型决定变量何时创建,何时销毁,以及变量的值保持多久。有三个地方可以存储变量:
普通内存
运行时堆栈
硬件寄存器
变量的默认存储位置取决于它的声明位置。
静态变量
在代码块外声明的变量总是存储于静态内存中,不在堆栈中,这样的变量称为静态变量。静态变量在程序开始前创建,在程序运行过程中一直存在,在程序执行完毕后销毁。
自动变量
在代码块内声明的变量默认存储类型是自动的,它存储于运行堆栈中,称为自动变量。关键字auto用于修饰这种存储类型,但是很少被使用,因为代码块中声明的变量本就是自动存储类型。这类变量,在程序执行到声明变量的地方才被创建,在离开代码块后被销毁。一个函数可能多次被调用,函数中声明的变量每次都会创建,销毁。
对于在代码块中创建的变量(自动存储类型),在其前面加上关键字static可以使其存储类型变为静态存储类型,但是这并不意味着修改了变量的作用域,它只能在该代码块中被访问。
寄存器变量
register关键字可以用于自动变量的声明,它表明该变量存储于机器的寄存器中而不是堆栈中。因为处理器的寄存器有限,如果有太多的变量被声明为寄存器变量,那么编译器只取前几个,其余的按照自动变量处理。
寄存器中的数据读取速度快,所以通常把那些频繁使用的变量声明为寄存器变量。有的编译器会判断出那些变量使用最频繁,所以编译器可能会彻底忽略register关键字,而由编译器决定那些变量存储于寄存器中。
我们知道寄存器会存储其他信息,所以变量创建时,需要将寄存器中原始的数据保存在堆栈里。在变量销毁时候,会将堆栈中原来的数据恢复回来。许多机器不为寄存器指定地址,其次寄存器在不同时刻保存着不同的数据,所以机器不提供寄存器变量的地址。
初始化
如果不显式地为静态变量指定初始值,静态变量将被初始化为0。由于静态变量是静态链接,所以静态变量的初始化过程中,可以将将要初始化的值放在程序执行时静态变量对应的位置上。
对于自动变量程序链接时并不知道自动变量存储的位置,所以自动变量的初始化,实际上是两个步骤,其一是创建变量,其二是给变量赋值。所以下面两种方式只有风格之差,并没有效率上的差别:
// 1
int a = 10;
// 2
int a;
a=10;
最后,如果没有对自动变量进行显式的赋值,那么它的值将是不确定的。