网站大量收购独家精品文档,联系QQ:2885784924

第20讲-运行时存储II.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第20讲-运行时存储II

中国科大 编译原理和技术 本讲纲要 全局分配策略 非局部名字的访问 参数传递 分配策略分类 局部分配策略 过程内部的存储分配策略,主要考虑的是活动记录内的内存布局 全局分配策略 为完整的程序完成存储分配,所要采取的内存分配策略 代码 全局、静态数据 活动记录之间的组织方式 动态分配的内存 三种全局分配策略 6.2.2 静态分配策略 静态分配特点 名字在程序被编译时绑定到存储单元,不需要运行时的任何支持。 绑定的生存期是程序的整个运行时间 如果完全采取静态分配策略,那么 不能允许过程递归 数据对象的长度及其在内存中的位置,都必须是编译时就可以知道的 不允许动态的数据结构 6.2 全局存储分配策略 6.2.3 栈式分配 栈式分配主要用于管理过程的活动记录。 局部变量的生存期是过程活动的时间。 控制进入该过程时,局部变量绑定到存储单元,过程活动结束后,局部变量的空间释放。 6.2 全局存储分配策略 6.2.3 栈式分配 6.2 全局存储分配策略 当前活跃着的过程活动可以保存在一个栈中 控制栈的内容:s, q (2, 3), p(2, 3) 6.2 全局存储分配策略 运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录) 6.2 全局存储分配策略 运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录) 6.2 全局存储分配策略 运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录) 6.2 全局存储分配策略 运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录) 6.2 全局存储分配策略 栈式分配的动态释放空间引起悬空引用:引用某个已被释放的存储单元 main() | int ? dangle ( ) { | { int ?q; | int j = 20; q = dangle ( ); | return j; } | } 6.2 全局存储分配策略 6.2.4 堆式分配 程序根据需要进行内存的分配 函数int *f(){ …; return p;} 这里的p必须是在堆上分配的内存,为什么? 三种存储分配策略的比较 本讲纲要 全局分配策略 非局部名字的访问 参数传递 6.3 非局部名字的访问 本节介绍 过程内部如何访问过程外部声明的名字? 不同的作用域规则下,非局部名字的访问方式有所不同 静态作用域 无过程嵌套的静态作用域(C语言) 有过程嵌套的静态作用域(Pascal语言) 动态作用域(Lisp语言) 6.3 非局部名字的访问 6.3.1 无过程嵌套的静态作用域 过程体中的非局部引用的一定是全局名字 全局名字的地址可以静态确定 无须深入栈中取数据,无须访问链 6.3 非局部名字的访问 6.3.2 有过程嵌套的静态作用域 过程嵌套深度 实例(教材P.199, 图6.17): sort 1 readarray 2 exchange 2 quicksort 2 partition 3 变量的嵌套深度:它的声明所在过程的嵌套深度作为该名字的嵌套深度 6.3 非局部名字的访问 寻找非局部名字存储单元的访问链 6.3 非局部名字的访问 1、假定过程p的嵌套深度为np,它引用嵌套深度为na的变量a,na ? np。如何访问a的存储单元? 从栈顶的活动记录开始,追踪访问链np ? na次,到达a的声明所在过程的活动记录。 访问链的追踪用间接操作就可完成。 6.3 非局部名字的访问 访问非局部名字的存储单元 6.3 非局部名字的访问 过程p对变量a访问时,a的地址由下面的二元组表示: (np ? na,a在活动记录中的偏移) 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np nx的情况 x肯定就声明在p中 被调用过程的访问链必须指向调用过程的活动记录的访问链 6.3 非局部名字的访问 2、建立访问链 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np ? nx的情况 sort 1 readarray 2 exchange 2 quicksort 2 partition 3 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np ? nx的情况 p和x的嵌套深度分别为1,2,…,nx? 1的外围过程肯定相同 追踪访问链np ? (nx – 1)次,到达了静态包围x和p的且离它们最近的那个过程的最新活动记录 所到达的访问链就是x的活动记录中的访问链应该指向的那个访问链 6.3 非局部名字的访问 2、建立访问链 6.3

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档