【问题标题】:Max Activation Record on a stack堆栈上的最大激活记录
【发布时间】:2019-02-19 03:49:43
【问题描述】:

这个问题很简单。这是我在大学编程考试时遇到的一个问题。现在,我在任何地方都找不到答案。你们中有人知道堆栈上的最大 AR 数量是多少吗?在 C++ 中。

【问题讨论】:

  • C++语言没有定义调用栈和激活记录,也没有定义任何限制嵌套函数调用层级的实现量,所以这个问题比较没有意义。在实践中,它受到编译器标志和/或可用内存的限制,但它通常不是固定数量的 AR,而是为堆栈分配的固定数量的内存。
  • @n.m.这个问题对使用调用堆栈的 C++ 实现非常有意义。您可能想列出不使用调用堆栈的 C++ 实现。
  • @MaximEgorushkin 为了回答有关实现的问题,您需要命名该实现。对于 10 个实现中的大约 10 个,答案将是“取决于”。

标签: c++ record activation


【解决方案1】:

An activation record (aka stack frame) 至少包含函数返回地址。例如,x86 CALL 指令将返回地址压入堆栈,RET 将其弹出。所以,理论上的最大值是max_stack_size / sizeof(void(*)())。大多数函数使用的参数和局部变量也可能占用调用堆栈,以及stack protection canaries

您可以使用ulimit -s bash 命令或以编程方式使用getrlimit(RLIMIT_STACK, ...) 找到max_stack_size

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2011-07-14
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2012-03-04
    • 2012-01-17
    相关资源
    最近更新 更多