活动记录

2025 年 6 月 9 日 | 阅读时间 3 分钟
  • 控制是一个运行时栈,用于跟踪活动的程序过程激活,即用于找出其执行尚未完成的过程。
  • 当它被调用(激活开始)时,过程名称将被推入栈中,当它返回(激活结束)时,它将被弹出。
  • 活动记录用于管理过程的单次执行所需的信息。
  • 当一个过程被调用时,一个活动记录被推入栈中,当控制返回给调用函数时,它被弹出。

下图显示了活动记录的内容

Activation Record

返回值:它被调用过程用来将一个值返回给调用过程。

实际参数:它被调用过程用来将参数提供给被调用的过程。

控制链接:它指向调用者的活动记录。对于每个函数,都会创建一个新的活动记录。

例如

说明

在上面的例子中,有一个控制链接将 add_result 的活动记录连接到 class calculator 的活动记录。

访问链接:它用于引用保存在其他活动记录中的非局部数据。

例如

说明

在上面的例子中,可以使用访问链接访问在当前活动记录中找不到的局部值。

保存的机器状态:它保存了过程被调用之前的机器状态信息。

局部数据:它保存了过程执行的局部数据。

临时变量:它存储在表达式求值过程中产生的值。

示例 1

评估一个简单的程序来理解活动记录的概念。在这个例子中,我们取了一个名为 "subtract" 的函数,它返回两个数字相减的结果。

输出

以下是这个例子的输出。

The Result is: 2

说明

在上面的例子中,程序开始使用 'main' 函数。它有局部变量,如 'r' 和 's'。当从 main 函数调用 'subtract' 函数时,会创建一个新的活动记录。 'subtract' 的活动记录使用来自调用函数的参数(如 'p' 和 'q')进行初始化,这些参数具有值(12 和 10)。 结果存储的值为 2。 一旦 'subtract' 函数终止,活动记录将从调用栈中删除。 最后,当 'main' 函数终止时,它的活动记录将从栈中删除。

如何使用活动记录管理内存?

它在内存管理中起着重要作用,因为它有助于跟踪正在使用的内存。 内存是在活动记录中管理的,以优化代码性能和资源使用。

下面给出了使用活动记录管理内存的步骤

  • 当一个函数被调用时,会创建一个活动记录来存储该函数的局部变量和其他数据。
  • 此函数返回活动记录并释放它使用的内存。
  • 被调用的函数创建活动记录并将其插入到栈中,并在活动内存中为变量分配内存。

活动记录的属性

下面给出了活动记录的一些属性

  • 它遵循栈数据结构。
  • 它有助于阻止控制流的返回地址。
  • 它保存控制和访问链接,这些链接可用于嵌套函数调用。
  • 它有助于收集特定数据,如参数、局部变量等。

关于活动记录的常见问题

1. 什么样的 data 存储在活动记录中?

活动记录在运行时环境中存储在栈上。

活动记录存储数据,例如

  • 临时值
  • 局部数据
  • 访问链接
  • 返回值
  • 实际参数

2. 活动记录中的栈指针有什么作用?

在活动记录中,栈指针跟踪栈的顶部。它允许我们控制当前正在执行的活动记录。


下一主题存储分配