存储类修饰符和变量的生存期
存储类修饰符
存储类修饰符(Storage Class Specifier)有以下几种关键字,可以修饰变量或函数声明:
(1)static,用它修饰的变量的存储空间是静态分配的,用它修饰的文件作用域的变量或函数具有Internal Linkage。
(2)auto,用它修饰的变量在函数调用时自动在栈上分配存储空间,函数返回时自动释放,auto可以省略不写, auto不能修饰文件作用域的变量。
(3)register,编译器对于用register修饰的变量会尽可能分配一个专门的寄存器来存储,但如
果实在分配不开寄存器,编译器就把它当auto变量处理了, register不能修饰文件作用域的
变量。现在一般编译器的优化都做得很好了,它自己会想办法有效地利用CPU的寄存器,所以现在register关键字也用得比较少了。
(4)extern,链接属性是根据一个标识符多次声明时是不是代表同一个变量或函数来分类的, extern关键字就用于多次声明同一个标识符。
(5)typedef,它并不是用来修饰变量的,而是定义一个类型名。看typedef声明,首先去掉typedef把它看成变量声明,看这个变量是什么类型的,那么typedef就定义了一个什么类型,也就是说,typedef在语法结构中出现的位置和前面几个关键字一样,也是修饰变量声明的,所以从语法(而不是语义)的角度把它和前面几个关键字归类到一起。
变量的生存期
变量的生存期(Storage Duration,或者Lifetime) 分为以下几类:
(1)静态生存期(Static Storage Duration),具有外部或内部链接属性,或者被static修饰的变
量,在程序开始执行时分配和初始化一次,此后便一直存在直到程序结束。这种变量通常位
于.rodata,.data或.bss段。
(2)自动生存期(Automatic Storage Duration),链接属性为无链接并且没有被static修饰的变
量,这种变量在进入块作用域时在栈上或寄存器中分配,在退出块作用域时释放。
(3)动态分配生存期(Allocated Storage Duration),,调用malloc函数在进程的堆空间中分配内存,调用free函数可以释放这种存储空间。