【问题标题】:What is the maximum stack level for a C++ program?C++ 程序的最大堆栈级别是多少?
【发布时间】:2017-01-11 12:43:19
【问题描述】:

我试图看看在 C++ 中通过递归导致堆栈溢出之前我能走多远。我写了这个函数

long recurse( long level ) {
    std::cout << level << std::endl;
    return recurse( ++level ) * 12 //to avoid tail recursion optimization, if present
}

我称之为传递 0 作为第一个值。它打印的最后一个数字是 349411,然后它打印 Segmentation fault 并停止运行。我的猜测是它内存不足,但是在 Lua 中抛出 stack overflow 错误之前,使用相同值调用的相同函数会打印 499982,如果 Lua 函数的内存权重比 C++ 函数小,我会感到惊讶。

那么 C++ 程序在停止执行之前可以达到的最大堆栈级别是多少?

真的是“直到它有记忆”,还是有固定的限制?

为什么还要打印Segmentation fault

那不是只有在未经授权的方式访问内存时才打印消息吗?

【问题讨论】:

  • 这是定义的实现
  • 这严重依赖于系统。
  • 内存不足应该打印什么错误?可能是分段错误
  • @GillBates 它甚至不是实现定义的。实现不需要记录递归限制。
  • 当系统的堆栈空间用完时,您会以“未经授权的方式”访问超出它的内存,因此会出现消息。 Lua 的调用栈由 Lua 运行时管理,完全独立。

标签: c++ recursion stack-overflow


【解决方案1】:

可用于递归的内存量取决于编译器设置、操作系统和物理平台。没有最小和最大限制。

当内存不足时,可以打印各种错误,一个常见的消息是“Segmentation fault”。

还有为什么会打印分段错误?

那不是只有在未经授权的方式访问内存时才打印消息吗?

您的程序通过要求比可用内存更多的内存或访问程序范围(分配)之外的内存以未经授权的方式访问内存,因此操作系统很好并显示分段错误。您的操作系统可能已经破坏了您的计算机或挂起或重新启动。一些平台显示蓝屏死机

【讨论】:

  • 一个相当现代的操作系统在这种情况下不会蓝屏。
  • @Kevin:我从不认为 BSoD 是合理的行为,也不认为操作系统是合理的。 ;-)
  • @ThomasMatthews:你知道,Windows 95 有基本的内存保护。它会蓝屏,但不是来自堆栈溢出的简单情况。
【解决方案2】:

您要问的是非常依赖于实现的。这有许多取决于它的因素,主要是编译器可用的计算机内存,这在计算机之间有很大差异。当然,对此没有单一的标准,但您当前得到的错误Segmentation Fault 是可能打印的众多错误之一。一些编译器甚至打印Stack Overflow

【讨论】:

  • 您可以拥有 1 TB 的内存并拥有一个将递归限制为 1GB 的编译器,或者操作系统将您的程序限制为仅使用 2GB。是的,有很多因素,但不一定是平台上的内存量。
【解决方案3】:

如果 Lua 函数的内存权重比 C++ 函数小,我会感到惊讶。

您假设 Lua 使用 C++ 堆栈进行 Lua 函数调用。

不是。 Lua 有自己的函数栈,有自己的限制。就像 Lua 有自己的内存空间(诚然由主机提供)等等。

C++ 堆栈的限制是依赖于实现的,不能先验地确定。

那不是只有在未经授权的方式访问内存时才打印消息吗?

是的。这就是你所做的。您尝试访问的堆栈空间超出了分配的范围。那是访问你没有被授权访问的内存。

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 2015-02-13
    • 2010-12-22
    • 2019-10-20
    • 2011-06-29
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多