什么是C和C ++上下文中的激活记录?

时间:2009-08-12 13:40:11

标签: c++ c

对于C / C ++程序员来说,它是什么意思以及了解它有多重要?

平台上是否一样,至少在概念上是这样?

我将它理解为用于通过函数存储局部变量的已分配内存块...

我想知道更多

4 个答案:

答案 0 :(得分:49)

激活记录是Stack Frame的另一个名称。它是组成调用堆栈的数据结构。它通常由以下部分组成:

  • 来自被叫方的当地人
  • 将地址发送给来电者
  • 被叫者的参数

因此,调用堆栈由任意数量的激活记录组成,这些激活记录在添加新的子例程时被添加到堆栈中,并在它们返回时从堆栈中移除(通常)。

元素的实际结构和顺序是平台,甚至是实现定义。

对于C / C ++程序员,此结构的一般知识对于理解某些实现功能(如调用约定)以及为什么缓冲区溢出允许运行第三方恶意代码非常有用。

更强大的知识将进一步推动上述概念,并允许程序员调试其应用程序并读取内存转储,即使没有调试器或调试符号也是如此。

更一般地说,一个C / C ++程序员可以在他们的业余爱好者编程生涯中占据很大一部分,甚至不需要考虑调用堆栈。

答案 1 :(得分:7)

激活记录不是一个在谈论C或C ++语言本身时使用的概念。 激活记录的格式非常特定于平台。

从概念上讲,参数的传递方式,局部变量的生命周期,函数返回的位置以及调用堆栈如何响应推测投掷都是C ++的重要组成部分(后者除外)。有关如何实现这些内容的详细信息将影响特定平台的激活记录,但在C ++或C中编写代码通常不需要了解这一点。

答案 2 :(得分:4)

当我们调用函数时,我们需要一个地方来存储调用者和被调用者的上下文,这个地方叫做激活记录(AKA 堆栈框架)。

是,激活记录撰写调用堆栈,但这并不意味着激活记录必须基于堆栈。它是特定于实现的

你可能想知道“任何例子?”。

  • 当然,只需查看IBM mainframes' stackless design堆栈不可用,其激活记录 基于堆
  • 相反,还有一个平台不提供(AKA 无堆),例如Arduino(但它也意味着<不能使用strong> new 关键字和 new-expression
  • 除硬件限制外,某些功能语言无法在堆栈上存储本地变量,因此激活记录会在堆上分配,如果您想知道原因,here是一个很好的参考。

就像@FrakHB所说,不仅堆栈,其他区域的内存也可能是激活记录,这就是特定于实现的的含义。

答案 3 :(得分:-2)

激活记录包含以下三件事

1.功能定义
2.可变定义
3.功能应用(函数调用)