什么是激活记录?
激活记录是一种数据结构,在调用过程/函数时被激活/创建,其中包含以下关于函数的数据。
C语言中的激活记录包含:
- 实际参数
- 参数个数
- 返回地址
- 返回值
- 旧栈指针 (SP)
- 函数或过程中的局部数据
这里,**旧SP**存储调用此过程并导致生成此激活记录的过程的激活记录的栈指针值,即它是调用方激活记录的指针。
在栈分配方案中,当过程A调用过程B时,B的激活记录将被压入A的激活记录之上。当过程B调用过程C时,C的激活记录将被压入B的激活记录之上,如图所示:
栈分配方案需要两个指针:
- **栈顶指针 (top)** - 指向栈顶。top指向最顶层激活记录的顶部。在图中,top指针将指向C激活记录的顶部。
- **栈指针 (SP)** - 指向当前活动过程的激活记录。
在图中,过程C是当前活动过程。因此,指针SP将指向C的激活记录。
过程C激活记录上的指针**SP**包含旧SP的值。这里旧SP指的是前一个栈指针的值,即前一个激活记录B。因此,C激活记录中的旧SP包含B激活记录中SP的值。
全局数据空间是固定的,并在栈的一角静态分配。
**保存的机器状态** - 保存过程被调用之前的机器状态信息。此信息包括程序计数器和机器寄存器的值,这些值必须在控制权从过程返回时恢复。
**可选访问链接** - 定义保存在其他激活记录中的非局部数据。
**可选控制链接** - 指向调用方的激活记录。
**实际参数** - 调用过程用来向被调用过程提供参数。
**返回值** - 被调用过程用来向调用过程返回值。上述每个字段的大小在调用过程时确定。几乎所有字段的大小都可以在编译时确定。
广告