- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
6.4堆式动态存储分配6.4.1堆式存储的概念如果一种程序语言允许数据对象能够自由地分配和释放,或者不仅有过程而且有进程(process)这样的程序结构,那么由于空间的使用不一定遵循“先申请后释放”的原则,则栈式存储分配就不适用了。在这种情况下,通常使用一种称之为堆的动态存储分配方案。假定程序运行时有一个大的存储空间,需要时就从这个空间中借用一块,不用时再退还给它。第62页,共94页,星期日,2025年,2月5日由于借、还的时间先后不一,因而经过一段时间的运行后,这个大空间就必然被分割成如图6–15所示的许多小块,这些块有些正在使用,有些则是空闲的(未被使用)。第63页,共94页,星期日,2025年,2月5日图6–15堆式存储分配示意第64页,共94页,星期日,2025年,2月5日对于堆式存储分配来说,需要解决两个问题:一是堆空间的分配,即当运行程序需要一块空间时应分配哪一块给它;另一个问题是分配空间的回收,由于返回堆的不用空间是按任意次序进行的,所以需要研究专门的回收分配策略。在许多语言中都有显式的堆空间分配和回收语句或函数,如PASCAL语言中的new和dispose、C语言中的alloc和free以及C++语言中的new和delete。第65页,共94页,星期日,2025年,2月5日6.4.2堆式存储管理的方法由于堆式分配方式和存储管理技术较为复杂,并且有效的堆管理是数据结构课程研究的问题,故我们只对堆式分配方式作简单的讨论。当运行程序要求一块体积为N的存储空间时应如何分配?从理论上讲,这时应从比N稍大一些的空闲块中取出N个单元予以分配,这种做法的目的是保持较大的空闲块以备将来之需。但这种方法实现起来难度较大,实际中采用的办法是:扫描空闲块链并在首次遇到的比N大的空闲块中取出N个单元进行分配。第66页,共94页,星期日,2025年,2月5日图6–6进入过程P后所做的工作示意第30页,共94页,星期日,2025年,2月5日3.过程返回C语言以及其它一些相似的语言含有return(E)形式的返回语句,其中E为表达式。假定E值已计算出来并存放在某临时单元T中,则此时即可将T值传送到某个特定的寄存器中(调用过程将从这个特定的寄存器中获得被调用过程P的结果)。剩下的工作就是恢复SP和TOP为进入过程P之前的原值(即指向调用过程的活动记录及工作空间),并按返回地址实行无条件转移,即执行下述指令序列:第31页,共94页,星期日,2025年,2月5日TOP=SP–1 /*恢复调用过程的TOP值*/SP=0[SP] /*恢复调用过程的SP值*/X=2[TOP] /*将返回地址送X*/UJ0[X] /*无条件转移,即按X的地址返回到调用过程*/一个过程也可通过它的end语句(对C语言则是该过程(函数)体结束时的“}”)自动返回。如果此过程是一个函数过程,则按上述办法传递结果值,否则仅直接执行上述返回指令序列。过程P的返回示意如图6–7所示。第32页,共94页,星期日,2025年,2月5日图6–7过程P的返回示意第33页,共94页,星期日,2025年,2月5日6.3嵌套过程语言的栈式实现在简单程序语言实现中是允许过程的递归调用的,并且过程中可含有可变数组。现在,我们再加上一种功能,即允许过程的嵌套性。从结构上看,PASCAL就是这样的一种语言;但由于PASCAL含有“文件”和“动态变量”,因此,它的存储分配不能简单地用栈式方法来实现。采用PASCAL的一个子集,例如去掉“文件”和“动态变量”这种数据类型,那就可以用我们下面将要讨论的方法实现存储分配。第34页,共94页,星期日,2025年,2月5日6.3.1嵌套层次显示表(DISPLAY)和活动记录在讨论中,常常要用到过程定义的“嵌套层次”(简称层数)这个概念。我们始终假定主程序的层数为0,因此主程序称为第0层过程。如果过程Q是在层数为i的过程P内定义的,并且P是包围Q的最小过程,则Q的层数就为i+1。当编译程序处理过程说明时,过程的层数将作为过程名的一个重要属性登记在符号表中。第35页,共94页,星期日,2025年,2月5日由于过程定义是嵌套的,因而
原创力文档


文档评论(0)