zoukankan      html  css  js  c++  java
  • 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):

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/yr-linux/p/4935265.html
Copyright © 2011-2022 走看看