变量的存储类型是指存储变量值的内存类型,这也决定了变量何时创建、何时销毁以及它的值保存多久。
有三个地方用于存储变量:普通内存、运行时堆栈、硬件寄存器。
任何代码外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存(普通内存?)这类变量称为静态变量(并不表示变量的链接属性为intern,仍然是extern)。对于这类变量,无法为它们指定其它存储类型,并在程序运行前创建,程序结束后有系统回收,未初始化时默认值为0。
代码块内部声明的变量类型为自动的,存储与堆栈中,称为自动变量(用auto修饰,一般不用,代码块内变量缺省情况下就是自动变量)。程序执行到声明自动变量的代码块时,自动变量才会被创建,当吃程序的执行流离开代码块时自动销毁。未初始化是值为垃圾。
对于自动变量,加上static关键字后,可使其变为静态变量,但不能改变它的作用域。(函数的形参不能声明为静态变量,因为实参总是在堆栈中传递给函数,用于支持递归:函数的参数不能声明为静态,又要永久性的存在,可又必须放在堆栈中,这是不可能的.)
最好关键字register可以用于自动变量的声明,提醒它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。寄存器变量访问比存储与内存中的变量效率高,但编译器不一定理睬register关键字,如果太多变量声明为register,它只会选取前几个存储于寄存器中,其余的按普通自动变量处理。寄存器变量的创建和销毁时间和自动变量相同但使用寄存器之前需要对寄存器的原有值保存到堆栈中,当使用完后再复制回寄存器。(把自动变量复制到寄存器中也需要时间,用register节省的开销不一定抵得上复制这些的开销)
static有不同的功能:用于代码块外的变量声明时,修改变量链接属性从extern到intern,存储类型和作用域不变。
用于代码块内声明变量时,用于修改存储类型,从自动变量变为静态变量,但链接属性和作用域不变。