什么是简单的栈分配方案的实现
栈分配方案是最简单的运行时存储管理技术。存储在栈中从一端开始顺序分配。存储的释放顺序应该与分配顺序相反,以便释放的存储块始终位于栈顶。
程序由数据和过程组成。执行每个过程时,会占用一定量的内存,其中包含有关过程的信息,即其实际参数、参数数量、返回地址、返回值和局部数据等。内存的这一部分是该过程的**活动记录**。
活动记录
活动记录是一种数据结构,在调用过程/函数时被激活/创建,它包含以下关于函数的信息。
C语言中的活动记录包含:
- 实际参数
- 参数数量
- 返回地址
- 返回值
- 旧栈指针 (SP)
- 函数或过程中的局部数据
这里,**旧SP**存储调用此过程并导致生成此活动记录的过程的活动记录的栈指针值,即它指向调用者的活动记录。
栈分配方案需要两个指针:
- **top**——它指向栈顶。top 指向最顶层活动记录的顶部。在图中,top 指针将指向 C 活动记录的顶部。
- **栈指针 (SP)**——它指向当前活动过程的活动记录。
**实际参数**——调用过程使用它向被调用过程提供参数。
**返回值**——被调用过程使用此字段将值返回给调用过程。上述每个字段的大小在调用过程时确定。几乎所有字段的大小都可以在编译时确定。
过程调用的栈分配
可以分析在运行时调用过程和从过程返回值时如何分配内存。
考虑一个过程 P(x1, x2, x3 … … xn)。此过程调用的三地址代码语句将是
param x1
param x2
…………….
param xn
call P, n
其中 𝐜𝐚𝐥𝐥 𝐏, 𝐧 → 调用具有 n 个参数的过程 P。
𝐏𝐚𝐫𝐚𝐦 𝐱 → 指的是传递实际参数 x。
执行与过程相关的所有以下语句将在运行时执行栈分配。
- 𝐏𝐚𝐫𝐚𝐦 𝐱 ∶ 传递实际参数 x。
- 𝐜𝐚𝐥𝐥 𝐏, 𝐧− 调用具有 n 个参数的过程 P。
- 𝐩𝐫𝐨𝐜𝐛𝐞𝐠𝐢𝐧− 过程的第一条语句
- 𝐫𝐞𝐭𝐮𝐫𝐧(𝐯𝐚𝐥𝐮𝐞)− 返回值时。
- 𝐞𝐧𝐝− 过程的最后一条语句。
广告