4.7 C语言的存储类,作用域,生命周期,链接属性

Posted 岳睿_02

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.7 C语言的存储类,作用域,生命周期,链接属性相关的知识,希望对你有一定的参考价值。

C语言背后的运行机制,学会了会对C语言更加熟悉,可以直接看到C语言的骨头里去。

 

存储类(storage class):

  ①什么是存储类?

  存储类就是变量存储类型,即变量在内存中存储在什么段。

  例如:栈:普通局部变量。 

     数据段(.data):初始化不为零的全局变量,静态局部变量。 

     bss段:初始化为零 或 未初始化的全局变量。 (其实bss段就是初始化为0的数据段)

       代码段(.text):存放程序执行代码的一块内存区域。

  

  ②存储类相关的关键字?

  auto  static  register  extern  volatile  restrict  typedef

  详解:

  auto:作用: 是修饰局部变量。 存储类:局部变量存储在栈上。栈有四个特性:反复使用;脏内存;临时性;栈会溢出;

  

  static: 作用:首先static有两个作用(平时记得不是很清楚),

      ①修饰局部变量,成为静态局部变量。

        什么是静态局部变量?          答:  静态局部变量是带static修饰的普通局部变量;

          静态局部变量存储在哪儿? 答: 静态局部变量存储在数据段;

        为什么会有静态局部变量?   答:

        静态局部变量 它和非静态局部变量有什么区别?  答:静态局部变量存储在数据段/bss段。非静态局部变量分配在栈上。由于静态局部变量分配在数据段、bss

                                  段,所以允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值

                                  0,字符型变量赋空字符。

      ②修饰全局变量,成为静态全局变量。

        全局变量和静态全局变量的区别:链接属性不同,

 

      ps:静态局部变量和全局变量的区别:

                      相同点:

                            静态局部变量和全局变量存储类相同,都是存储在数据段/bss段

                           静态局部变量和全局变量的生命周期相同,都是伴随着整个源程序。

                      不同点:  

                         作用域:静态局部变量是代码块作用域(和自动局部变量一样)。而全局变量是文件作用域(和函数一样)。

                          链接属性:静态局部变量无链接。而全局变量是外链接。

    

  register: 作用:把修饰的变量尽可能的储存到寄存器中。

          ①为什么要放到寄存器中?    答:平时变量是存储在内存中的,加上register后,会尽量放在寄存器中,因为寄存器和内存相比,寄存器里CPU近,

                            所以访问变量的速度更快。

                         说明:数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存

                            放到内存里,CPU 不直接和内存打交道

          ②有什么好处?有什么缺陷?  答:好处是CPU里寄存器近,register修饰的变量用在那种变量被反复高频率的使用,通过改善这个变量的访问效率可以极

                           大的提升程序运行效率时。所以register是一种极致提升程序运行效率的手段。

                           缺陷:CPU的寄存器本来就很少,而且是尽可能的将变量分配到寄存器中。所以平时定义register变量要慎用。

  extern: 作用:主要是修饰                                                                                       

  volatile:

  restrict:

  typedef:

 

总结 存储类的出现也是因为操作系统对内存的管理机制所导致的,变量会存储在不同的内存中。

 

作用域(scope):

  ①局部变量的代码块作用域;

  ②函数名和全局变量的文件作用域

  ③同名变量的掩蔽规则

    

生命周期(lifetime):

以上是关于4.7 C语言的存储类,作用域,生命周期,链接属性的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,哪种存储类的作用域与生命周期是不一致的?

存储类作用域生命周期链接属性

存储类&作用域&生命周期&链接属性

7C_存储类 & 作用域 & 生命周期 & 链接属性

存储类生命周期作用域链接域

C语言 变量 函数 (类型作用域生命周期存储位置)