Linux C笔记之 变量存储类型 详解

存储类型:
变量的存储类型是指存储变量值的内存类型 ;
变量的存储类型决定变量何时创建、何时销毁以及它的值将保存多久 ;

    存储变量:普通内存、运行时堆栈、硬件寄存器;

    变量的缺省存储类型取决于它的声明位置;

    静态(static)变量:
   在代码块之外声明的变量,存储于静态内存中,也就是不属于堆栈的内存。
   静态变量,无法为它指定其他存储类型。它在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非给他赋一个不同的值或者程序结束。

    自动(automatic)变量:
    在代码块内部声明的变量的缺省存储类型,存储于堆栈中。
    关键字 auto 用于修饰这种存储类型,但极少使用。

    在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码块时,这些自动变量便自行销毁。如果该代码块被反复调用,这些自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也有可能不同。即使它们所占据的位置相同,你也不能保证这块内存同时不会有其他的用途。因此,我们可以说自动变量在代码块执行完毕后就消失,当代码块再次执行时,它们的值一般并不是上次执行的值。
    如果给声明在代码块内部的变量加上 static ,可以使它的存储类型从自动变为静态。具有静态存储类型的变量在整个程序执行过程中一直存在,而不仅仅在声明它的代码块执行时存在。注意: 修改变量的存储类型并不表示修改该变量的作用域,它仍然只能在该代码块内部按名字访问。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递参数,用于支持递归。

    寄存器(register)变量:
    存储于机器的硬件寄存器而不是内存中。
    寄存器变量比存储于内存的变量访问起来效率更高。但是,编译器不一定 “关注” register 关键字,如果有太多的变量被声明为 register ,它只选取前几个实际存储于寄存器中,其余的就按普通自动变量处理。

在典型情况下,你当然希望把使用频率最高的那些变量声明为寄存器变量。在有些计算机中,如果把指针声明为寄存器变量,程序的效率将能得到提高,尤其是那些频繁执行间接访问操作的指针。你可以把函数的形参声明为寄存器变量,编译器会在函数的起始位置生成指令,把这些值从堆栈中复制到寄存器中。但是,有可能,这个优化措施所节省的时间和空间的开销还抵不上复制这几个值所用的开销。
寄存器变量的创建和销毁时间和自动变量相同,但它需要一些额外的工作,在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值必须恢复,确保调用者的寄存器变量未被破坏。许多机器使用运行时堆栈来完成这个任务。当函数开始执行时,它把需要使用的所有寄存器的内容都保存到堆栈中,当函数返回时,这些值再复制会寄存器中。
在许多机器的硬件实现中,并不为寄存器变量指定地址。同样,由于寄存器值的保存和恢复,某个特定的寄存器在不同的时刻所保存的值不一定相同。所以,机器并不像你提供寄存器变量的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值