静态变量、自动变量与寄存器变量的存储

一、我们声明的变量有几类?

       变量的存储位置与变量的类型有关,这里变量的类型不是int、float之类的类型, 而是分为三类:静态变量、自动变量和寄存器变量。

        然而,变量到底属于这三类中的哪一类是根据变量在源文件中的声明位置声明方式所决定的。

二、这三类变量分别是怎么存储的(存储类型)?

       变量的存储类型(storage class)是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:静态内存、运行时堆栈、硬件寄存器。在这三个地方存储的变量具有不同的特性。

      (1)存储在静态内存的变量

               凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量也叫静态(static)变量。对于这类变量,你无法为它们指定其他存储类型。

               静态变量的生存期:静态变量在程序运行之前创建,在整个程序执行期间始终存在。


      (2)存储在堆栈内存的变量

               在代码块内部声明的变量的缺省存储类型是自动的(automatic),也就是说它存储于堆栈中,这类变量叫自动(auto)变量,也叫局部变量。有一个关键字auto就是用于修饰这种类型的,但它极少使用,因为代码块中的变量缺省就是自动变量。

               自动变量的生存期:在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码块时,这些自动变量便自行销毁。

               如果该代码块被执行多次,例如一个函数被执行多次,其内部的自动变量也就被重新创建多次。而且每次被创建的内存地址可能不同。


       (3)代码块中的静态变量

                      对于在代码块内部声明的 变量,缺省为自动变量,但如果给它加上关键字static,可以使它的存储类型从自动变为静态。这类变量也叫做静态局部变量,存储在静态内存中。

                       静态局部变量的生存期:代码块首次执行时创建该变量,直到整个程序结束。


               注意:虽然存储类型发生变化,但它的作用域并为改变,它仍然只能在该代码块内部通过变量名访问。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。
 
       (4)在硬件寄存器中的变量
                关键字register可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率更高。

                注意:声明为寄存器变量只是一种美好的愿望 ^_^,因为编译器不一定会理你!
                因为寄存器就那么几个,要是太多变量被声明为register,它可不会都放进寄存器。它一般只选取前几个实际存储于寄存器中,其余的原来怎样还怎样。 如果有些编译器自己具有一套寄存器优化方案,他也可能忽略register关键字,依据是由编译器决定哪些变量存储于寄存器比你人脑的决定更为合理 ←_← !



你可能感兴趣的:(C语言)