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):

时间: 2024-10-16 23:48:07

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

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

储存类:变量在定义时的储存类型对其在程序中的生命周期.连接属性及作用域有很大的关联链接属性: 无连接.内连接.外链接关键字:1.auto    用于修饰局部变量,在定义局部变量时,将其定义在栈上.普通局部变量存放在栈上,因为栈内存的特性决定了普通局部变量定时如果未初始化其的值是随机的,因为栈内存是脏的,变量在释放后并未对其初始化,且栈内存被广泛运用,也就造就了普通变量的特性.普通局部变量的生命周期是临时,可从其存放于栈上看出其临时的特性.普通局部变量的作用域为代码块中"{}",C89与

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

Linux下c内存映像 大方向分为 应用空间 + 内核空间,他俩内存空间布局差不多.这里重点回顾应用空间布局,应用空间氛围代码段 + 数据段(静态数据段+动态数据段) 代码段 为啥是只读的 代码段在编译时就定好了,在程序的运行过程中,不能在代码段去开辟空间,以及释放空间. 包含哪几部分 ELF头.段头部表.init节 参考:剖析可执行文件ELF组成 .text 指令节,也叫代码节,所有函数中的指令都放在了.text节中.能够与指令直接弄在一起的常量,也随指令一起放在了.text中. .rodat

【Java】【JVM】类的生命周期【整理】

参考如下两篇并整理. https://www.cnblogs.com/dongguacai/p/5860241.html https://www.cnblogs.com/ITtangtang/p/3978102.html 类的生命周期是从被加载到虚拟机内存中开始,到卸载出内存结束.过程共有七个阶段. 1.加载---2.验证---3.准备---3.解析---5.初始化---6.使用---7.卸载 加载---(链接)----验证(校验.检查)----准备----解析-----初始化----使用---

java类的生命周期

类的生命周期:加载.连接(验证.准备.解析).初始化.使用.卸载主动引用(有且只有)初始化: 1.new.getstatic.putstatic.invokestatic如果类没初始化,则初始化new关键字实例化对象.读取或设置一个类的静态字段(被final修饰.*已在编译期把结果放入常量池的静态字段除外).调用一个类的静态方法  2.使用java.lang.reflect包的方法对类进行发射调用的时候,如果类没有进行过初始化,则初始化 3.当初始化一个类的时候,父类没初始化,则初始化 4.当虚

【Android 细节(二)】业务操作类的生命周期中的开始方法

为了防止内存泄露或者其他更重要的原因,为业务操作类构建生命周期是必不可少的. 即在类里封装onStart(),onPause(),onFinish()方法.比如我要写一个Android中处理数据库的业务类,他的特点是所有的数据操作是以key-value的方式存储. Databaser.java: <span style="font-family:Microsoft YaHei;font-size:18px;">// 构造方法 public PhoneDbAdapter(Co

【转】Java 类的生命周期详解

一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区

JVM类加载器及Java类的生命周期

预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar).由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作.扩展扩展(Extension)类加载器: 是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的.它负责将< Java_R

Java类的生命周期详解

引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几

【转载】详解java类的生命周期

原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,

类的生命周期(下)类的初始化【转】

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化.在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值.(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化 [html] view plaincopyprint? public