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

veh*_*zzz 40 c c++

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

它在整个平台上是否相同,至少在概念上如此?

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

我想了解更多

Ale*_*ell 53

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

  • 当地人到被叫者
  • 返回呼叫者的地址
  • 被调用者的参数

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

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

对于C/C++程序员,这种结构的一般知识有助于理解某些实现功能,如调用约定,甚至为什么缓冲区溢出允许运行第三方恶意代码.

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

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

  • @FernandoGabrieli C中有不同的段,如代码段,堆栈段,堆段.所以功能代码将存储在代码段中.参考[this](http://www.geeksforgeeks.org/memory-layout-of-c-program/) (3认同)

CB *_*ley 7

激活记录不是一个在谈论C或C++语言本身时使用的概念.激活记录的格式非常具体.

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


陳 力*_*陳 力 5

当我们调用函数时,我们需要某个地方来存储调用者和被调用者的上下文,这个地方称为活动记录(又名堆栈帧)。

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

你可能想知道“有什么例子吗?”。

  • 当然,看看IBM大型机的stackless设计stack是不可用的,它的活动记录基于heap的
  • 相反,也有不提供的平台(AKA heap-less),例如Arduino(但这也意味着不能使用new关键字和new-expression)。
  • 除了硬件限制,一些函数式语言不能在上存储局部变量,所以它们的激活记录分配在堆上,如果你想知道原因,这里是一个很好的参考。

正如@FrakHB 所说,不仅是heapstack,其他内存区域也可以是活动记录,这就是具体实现的意思。