📄 6.3.2.htm
字号:
<html>
<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>
<body>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.3.0c.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.3.2b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>6.3.2 栈式存储分配</b></font>
<table><tr><td>    </td>
<td class="content">
<P>
栈式存储分配是基于控制栈的思想;存储空间被组织成栈,并且活动记录的推人和弹出分别对应于活动的开始和结束。在一个过程的每次调用中,局部名字的存储单元均包含在这次调用的活动记录之中。这样,与静态分配不同的是,在每次活动中把局部名字映射到新的存储单元,因每当一个调用发生时要往栈中推入一个新的活动记录。而且,局部名字的值在活动结束时将删除;即局部名字的值将丢失,因为当一个活动记录从栈中弹出时局部名字的存储空间也随之消失。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
下面我们将主要讨论在编译时刻已知所有活动记录大小的栈式存储分配形式。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
假设寄存器top标记栈顶。在运行时刻,一个活动记录的存储空间的分配与释放可以根据记录的大小通过top的增大与缩小来分别实现。在图6.6中以及其它一些图中,栈的增长箭头是向下的,即随着向下运动内存地址增加。因此向下增长意味着走向高地址。如果过程q的活动记录长度为a,则在q的目标代码即将执行以前栈顶top增加a。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
<b>例6.5</b> 图6.11表明当控制流通过图6.3的活动树时活动记录被推人或弹出运行时刻的栈中的情况。树中的虚线指向已经结束的活动记录。从过程s的一个活动开始执行。当控制到达s体中第一个调用时,过程r被激活,并且把它的活动记录推入到栈中。当控制从这个活动返回时,这个活动记录被弹出,在栈中仅留下s 的活动记录。在s的活动中,控制到达一个对q的调用,实参为1和9,并且把q的活动记录放在栈的顶部。每当控制在一个活动中时,它的活动记录就在栈的顶部。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
在图6.11的后面的两幅图中间有几次活动发生。在图6.11中的最后一副图中,活动p(1,3)和q(1,0)曾在q(1,3)的生存期间开始和结束过,所以它们的活动记录曾推入过栈中之后又从栈中弹出了,只留下栈顶的q(1,3)的活动记录。
</td></tr></table>
<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.3.0c.htm'" ></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.3.2b.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -