对于C / C ++程序员来说,它是什么意思以及了解它有多重要?
平台上是否一样,至少在概念上是这样?
我将它理解为用于通过函数存储局部变量的已分配内存块...
我想知道更多
答案 0 :(得分:49)
激活记录是Stack Frame的另一个名称。它是组成调用堆栈的数据结构。它通常由以下部分组成:
因此,调用堆栈由任意数量的激活记录组成,这些激活记录在添加新的子例程时被添加到堆栈中,并在它们返回时从堆栈中移除(通常)。
元素的实际结构和顺序是平台,甚至是实现定义。
对于C / C ++程序员,此结构的一般知识对于理解某些实现功能(如调用约定)以及为什么缓冲区溢出允许运行第三方恶意代码非常有用。
更强大的知识将进一步推动上述概念,并允许程序员调试其应用程序并读取内存转储,即使没有调试器或调试符号也是如此。
更一般地说,一个C / C ++程序员可以在他们的业余爱好者编程生涯中占据很大一部分,甚至不需要考虑调用堆栈。
答案 1 :(得分:7)
激活记录不是一个在谈论C或C ++语言本身时使用的概念。 激活记录的格式非常特定于平台。
从概念上讲,参数的传递方式,局部变量的生命周期,函数返回的位置以及调用堆栈如何响应推测投掷都是C ++的重要组成部分(后者除外)。有关如何实现这些内容的详细信息将影响特定平台的激活记录,但在C ++或C中编写代码通常不需要了解这一点。
答案 2 :(得分:4)
当我们调用函数时,我们需要一个地方来存储调用者和被调用者的上下文,这个地方叫做激活记录(AKA 堆栈框架)。
是,激活记录撰写调用堆栈,但这并不意味着激活记录必须基于堆栈。它是特定于实现的。
你可能想知道“任何例子?”。
就像@FrakHB所说,不仅堆和堆栈,其他区域的内存也可能是激活记录,这就是特定于实现的的含义。
答案 3 :(得分:-2)
激活记录包含以下三件事
1.功能定义
2.可变定义
3.功能应用(函数调用)