Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C和C+的上下文中,激活记录是什么+;?_C++_C - Fatal编程技术网

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

C++ 在C和C+的上下文中,激活记录是什么+;?,c++,c,C++,C,对于C/C++程序员来说,了解它意味着什么以及了解它有多重要 至少在概念上,不同平台的情况是否相同 我把它理解为一块分配的内存,用来存储函数的局部变量 >我想知道更多的是< P/> < P>激活记录不是一个在C语言或C++语言中使用最多的概念。激活记录的格式非常特定于平台 概念上,如何传递参数、局部变量的寿命、函数返回到响应堆栈的调用堆栈如何展开,都是C++的重要部分(除了C后面)。这些实现的细节将影响某个特定平台的激活记录,但在C++或C.< /P> < P>中编写代码通常不需要这样的知识。

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

至少在概念上,不同平台的情况是否相同

我把它理解为一块分配的内存,用来存储函数的局部变量

<> >我想知道更多的是< P/> < P>激活记录不是一个在C语言或C++语言中使用最多的概念。激活记录的格式非常特定于平台


概念上,如何传递参数、局部变量的寿命、函数返回到响应堆栈的调用堆栈如何展开,都是C++的重要部分(除了C后面)。这些实现的细节将影响某个特定平台的激活记录,但在C++或C.< /P> < P>中编写代码通常不需要这样的知识。激活记录是堆栈帧的另一个名称。它是构成调用堆栈的数据结构。它一般包括:

  • 给被叫人打电话
  • 回电地址
  • 被调用方的参数
  • 上一个堆栈指针(SP)值
因此,调用堆栈由任意数量的激活记录组成,这些记录在添加新的子例程时添加到堆栈中,并在返回时从堆栈中删除(通常)

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

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

更深入的知识将进一步完善上述概念,并允许程序员在没有调试器或调试符号的情况下调试其应用程序和读取内存转储


不过,更一般地说,C/C++程序员可以在业余编程生涯中完成大部分工作,甚至不用考虑调用堆栈。

激活记录包含以下三个方面

1.功能定义
2.变量定义

3.函数应用程序(函数调用)

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

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

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

  • 当然,只要看看,堆栈不可用,它的激活记录是基于堆的
  • 相反,还有一个平台不提供heap(又称heap less),例如(但它也意味着新的关键字和新表达式不能使用)
  • 除了硬件限制外,一些函数式语言无法在堆栈上存储局部变量,因此它们的激活记录分配在堆上,如果您想知道原因,这是一个很好的参考

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

又名stack frame-请看@Neil,你的评论应该是答案。当你有太多的评论时,他们会生成一个关于编程问题的非常酷的网站。事实上,他没有,但我不喜欢发布只包含wikipedia链接的答案。函数调用的框架不需要在stack中实现。ISO C和ISO C++都不提及“堆栈”,除了“ISO-C++”第15条中的“堆栈展开”,这基本上是“自动对象的LIFO破坏”,除了实现细节外,没有其他事情可做。调用堆栈实际上允许从堆或内存的其他区域分配,而不是从ISA特定的堆栈分配。@Alexandre Bell我从您提到的内容中了解到AR(堆栈帧)包含本地变量、ret地址和参数。我的问题是:被调用函数的代码存储在哪里?@FernandoGabrieli C中有不同的段,如代码段、堆栈段、堆段。因此,功能代码将存储在代码段上。参考