1.变量的生存期 

 变量是内存空间的一种抽象,程序中定义的每个变量在运行时都有与之对应的内存空间。

  C++把变量占有的内存空间的时间段称为生存期,分为三类:静态生存期、动态生存期、自动生存期

  • 全局变量具有静态生存期;
  • 局部变量和函数的参数一般具有自动生存期;
  • 对于具有动态生存期的变量,其内存空间一般用new操作分配,用delete操作收回,这样的变量称为动态变量,动态变量具有动态生存期。

  定义局部变量时,可以加上存储类型修饰符:auto、static或register来显式地指出他们的生存周期。

  • 局部变量的默认存储类型为auto;
  • 定义static存储类型的局部变量具有静态生存期;
  • 定义register存储类的局部变量也具有自动生存期,与auto存储类的局部变量的区别在于register是建议编译程序将相应的局部变量的空间分配在CPU的存储器中,目的是提高对局部变量的访问效率,当然,register类型的局部变量的存储空间也可以在CPU的寄存器中,或者内存中。

  在C++程序中,定义的一个变量如果没有初始化,对于具有静态生存期的变量(全局变量、static存储类的局部变量),程序会隐式地自动把他们按位模式初始化为0;对于其他变量,编译程序不会初始化,初始值为内存空间已有的值,具有不确定性。

2.作用

  • 自动的局部变量起到节省内存空间的作用,当包含auto存储类的局部变量的函数调用结束后,其中的自动局部变量的内存就被收回了。
  • static存储类的局部变量的作用是,能在函数调用时获得上一次调用结束时该局部变量的值,即能在函数多次调用之间得以保留。

特别注意的是,static存储类的局部变量如果在定义中初始化,则该初始化只在函数第一次调用时进行,后面的调用中不再初始化,它的值为上一次调用结束时的值,受函数封装的保护。

3.存储的分配  

  当一个程序运行时,操作系统会为其分配一个内存空间,包括四个部分:静态数据区(static data)、代码区(code)、栈区(stack)和堆区(heap,或称自由存储区,free store),如下图所示(不同操作系统的顺序会不同)。

  在程序的内存空间中:

  • 静态数据区用于全局变量、static存储类的局部变量以及变量的内存分配;
  • 代码区用于存放程序的指令,对于C++,代码区存放的是所有函数的代码;
  • 栈区用于auto存储类的局部变量、函数的参数,及函数调用时的有关信息(如函数的返回地址等)的内存分配;
  • 堆区用于动态变量的内存分配

  静态数据区和代码区的大小是固定的,而栈区和堆区的大小将会随着程序的运行不断变化,不过,操作系统对于程序的栈区和堆区的最大值有一定的限制。

4.基于栈的函数调用的实现

  函数调用是通过栈来实现的,栈是一种元素个数可变的线性数据结构。其元素的增加和减少只能在某一端进行。

  1. 在C++函数调用时,调用者在栈中为形参函数返回地址分配空间,并将函数中实参的值和调用后的返回地址放入所分配的栈空间中;
  2. 函数调用中,被调用的函数在栈中为自动存储类的局部变量分配空间,并从栈中(通过形参)获得调用者提供的数据(实参的值);
  3. 函数调用后,被调用者释放局部变量的栈空间,并根据栈空间的返回地址返回到调用点(存储返回地址的栈空间将被释放);
  4. 调用者释放形参占用的的栈空间,然后继续执行调用之后的操作。

堆栈顺序:形参->函数返回地址->函数内的auto局部变量

   

转载于:https://www.cnblogs.com/guojun-junguo/p/9998236.html

变量的生存期和存储分配相关推荐

  1. 变量的生存期与存储类型

    变量的生存期与存储类型 1.变量的生存期 2.变量的存储类型 [1]自动变量 [2]外部变量 [3]静态变量 内部静态变量 外部静态变量 [4]寄存器变量 附:总结表 1.变量的生存期 所谓变量的生存 ...

  2. C++变量作用域、生存期、存储类别

    写C.C++代码的小伙伴一定在头疼变量的作用域.生存期.存储类别问题.什么静态.外部.寄存器.局部.全局搞得一头雾水.今天咱们就来梳理一下他们的变态关系(什么不得了的事情???) 1.变量的作用域 说 ...

  3. C语言变量的类型和存储位置

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  4. C++ 变量的生存期

    变量的生存期是指其在程序运行时占用内存空间的时间段. 1. 静态生存期 从程序开始执行时分配到程序结束时收回. 如:全局变量 2. 自动生存期 从程序执行到定义它们的复合语句时分配到复合语句执行完毕时 ...

  5. 【最新合集】编译原理习题(含答案)_15运行存储分配_MOOC慕课 哈工大陈鄞

    [最新合集]MOOC哈工大陈鄞 编译原理答案全集-->传送门 运行存储分配 1 在目标代码生成阶段,符号表用于(). A. 目标代码生成 B. 语义检查 C. 语法检查 D. 地址分配     ...

  6. C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节

    1.问题 1).结构体大小 结构体成员的内存分配满足下面三个条件   2 结构体第一个成员的地址和结构体的首地址相同   3 结构体每个成员地址相对于结构体首地址的偏移量是该成员大小的整数倍,如果不是 ...

  7. c语言如何存储已编译内容,二级C语言教程章节测试13.编译预处理和动态存储分配...

    一.选择题 (1)有以下程序 main() { char p[]={'a', 'b', 'c'}, q[]="abc"; printf("%d %d\n", s ...

  8. java程序在内存中的存储分配

    java程序在内存中的存储分配情况: 一. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)  2.jvm只有一个堆区(heap)被所有线 ...

  9. 【编译原理笔记15】运行存储分配概述,静态存储分配,栈式存储分配,调用序列和返回序列,非局部数据的访问,符号表,符号表建立

    本次笔记内容: 7-1 运行存储分配概述 7-2 静态存储分配 7-3 栈式存储分配 7-4 调用序列和返回序列 7-5 非局部数据的访问 7-6 符号表 7-7 符号表建立 本节课幻灯片,见于我的 ...

最新文章

  1. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
  2. 漫谈moosefs中cgi各项的意义
  3. ARM64移动处理器解惑
  4. 计算机控制系统的数字量输出通道由,计算机控制-习题
  5. 【游戏开发】小白学Lua(上)
  6. Viddy排名App Store免费应用第二,力压InstagramDraw Sth
  7. 华为softco直接用语音服务器注册IMS返回403错误代码
  8. cmd把一个较大的文件分割_将文件分割成较小的文件
  9. python中使用函数的优点是什么_python函数式编程是什么?
  10. 重要短信通知解决方案(短信通知+语音播报自动双呼)
  11. 3-AltiumDesignerPCB设计
  12. 【数据库笔记】高性能MySQL:chapter 5 创建高性能的索引
  13. MyEclipse如何配置Tomcat
  14. EXCEL一般使用技巧总结
  15. win10能联网但右下角出现小地球,无Internet连接解决方法
  16. oracle shared pool size,oracle 关于设置shared pool及sga大小
  17. Windows服务器时间偏差大问题校正
  18. html字幕精灵图标,Sayatoo字幕精灵(酷狗插件+预设模板含教程)
  19. PKI常见证书格式和转换
  20. 最短路径算法---狄杰斯特拉算法

热门文章

  1. 双 JK 触发器 74LS112 逻辑功能。真值表_原来单稳态触发器还可以这么构成!涨知识了...
  2. JZOJ 5268. 旅行
  3. 【五校联考6day2】san
  4. SDOI2020游记
  5. BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)
  6. 大学有哪些专业python_python就业方向有哪些?
  7. python 游戏脚本 vbs_用VBScript制作QQ自动登录的脚本代码
  8. c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
  9. python元组是数组吗,Python基础(4)——数组元组
  10. java内部类文件,Java内部类学习