- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
存储分配策略(15) 堆中,活跃的活动记录不一定相临,可能存在空洞 存储分配策略(16) 堆的释放 不释放 存储空间溢出时停止 显式释放 Free(C,PL/1),deallocation(Ada)… 有可能引起悬挂引用 隐式释放 单引用 引用计数 垃圾收集(Garbage collection) 堆的分配和释放的优化 访问非局部名字(1) 如何通过活动记录正确访问名字,满足作用域的要求? 两种作用域 静态作用域 根据程序正文决定用于名字的声明 最接近的嵌套规则 程序块 非局部名字的访问:访问链 动态作用域 在运行时,根据现行的活动来决定用于名字的声明,如Lisp等 访问非局部名字(2) 程序块 定义: 起源于Algol C语言中的定义:{ declarations statements } 允许嵌套 最接近的嵌套规则: 程序块B中声明的作用域包括B 如果名字x没有在B中声明,则B中x的出现是在外围程序块B’的x声明的作用域中,且满足: B’有x的声明 B’比其它任何含x声明的程序块更接近被嵌套的B 访问非局部名字(3) 例:非局部名字的引用 main( ) { int a = 0; int b = 0; { int b = 1; { int a = 2; printf(“%d, %d\n”, a, b); } { int b = 3; printf(“%d, %d\n”, a, b); } printf(“%d, %d\n”, a, b); } printf(“%d, %d\n”, a, b); } B 0 B 1 B 2 B 3 声明 作用域 int a = 0; B 0 -B 2 int b = 0; B 0 -B 1 int b = 1; B 1 -B 3 int a = 2; B 2 int b = 3; B 3 2 1 0 3 0 1 0 0 访问非局部名字(4) 名字的存储分配: 基于栈分配: 声明的作用域决不超出它所在的程序块 程序块当作无参的过程,所以活动记录可以是程序块的 这类“过程”调用不需要参数传递,控制只能沿静态正文进入和退出程序块 每次为一个完整的过程体分配存储空间 只为过程分配活动记录 过程内嵌套的程序块的生命所需要的存储空间由过程负责留出 要分配的变量在编译时刻确定,不考虑控制流 作用域不重叠的声明可以共享一个存储区域 a0 b0 b1 a2 , b3 访问非局部名字(5) 无过程嵌套的静态作用域 一个过程的定义不能出现在另一个过程里面,如C语言 对某个过程非局部的名字(过程中程序块的非局部名字的处理见前面的内容),其声明在所有函数之外 函数外声明的作用域:该声明后的所有函数体,但同名的局部声明的出现将掩盖全局声明的作用 例: int a[ 11 ]; readarray( ) { … … a … … } int partition(y , z) int y , z; { … … a … … } quicksort(m , n) int m , n; { … … } main ( ) { … … a … … } 访问非局部名字(6) 存储分配比较简单: 声明在任何过程外的所有名字的存储单元静态分配,其存储位置在编译时可知 过程中可见的名字: 非过程局部的,则使用静态确定的地址访问 其它的名字,局部于栈顶的活动纪录,可以通过base_sp访问 重要好处:程序中声明的过程可以作为参数传递和作为结果返回(C语言中是传递过程的指针) 非局部名字的访问不受过程激活方式的影响 访问非局部名字(7) 例: program pass( input , output ); var m : integer; function f( n : integer ) : integer; begin f := m + n end { f }; function g( n : integer ) : integer; begin g := m * n end { g }; procedure b( function h( n : integer ) : integer ); begin write( h (2) ) end { b }; begin m := 0; b( f ) ; b( g ) ; writeln end. 变量m对所有的过程是非局部的,可以静态分配它的存储单元 执行结果是:2 0 访问非局部名字(8) 有过程嵌套的静态作用域 非局部名字的访问: 寻找最接近的嵌套声明,如下面例子中函数partition对a的访问
您可能关注的文档
最近下载
- 中华人民共和国国歌-教案.doc VIP
- 2025年高考(全国一卷)数学试题和答案.docx VIP
- 离散数学答案(刘玉珍_编着).doc VIP
- 人民版六年级《劳动》上册全套教学课件.pptx
- 《城市规划原理》第3章 城乡规划体制.ppt VIP
- 基于SOR理论的社交网络互动对旅游行为的影响.docx VIP
- 哈曼JBL Live 770NC 无线罩耳式自适应降噪耳机 配置指南 (中国)说明书用户手册.pdf
- 《城市规划原理》第3章城乡规划体制.pptx
- 2025年最新的BRCGS包装材料全球标准第7版全套管理手册及程序文件.docx VIP
- 激光原理及应用陈家璧主编习题解答.pdf VIP
文档评论(0)