C / C ++程序的最大堆栈大小

我想在100 X 100阵列上进行DFS。 (假设数组的元素代表图形节点)因此,假设最坏的情况,递归函数调用的深度可以达到10000,每个调用占用20个字节。 那么可行的方法是否存在stackoverflow的可能性?

C / C ++中堆栈的最大大小是多少?

请为两者指定gcc
1)Windows上的cygwin
2)Unix

一般限制是什么?

avd asked 2019-08-13T05:58:25Z
6个解决方案
87 votes

在Visual Studio中,我认为默认的堆栈大小是1 MB,因此在递归深度为10,000的情况下,每个堆栈帧最多可以是~100个字节,这对于DFS算法应该是足够的。

包括Visual Studio在内的大多数编译器都允许您指定堆栈大小。 在某些(所有?)linux风格上,堆栈大小不是可执行文件的一部分,而是OS中的环境变量。 然后,您可以使用ulimit -s检查堆栈大小,并将其设置为新值,例如ulimit -s 16384

这是gcc默认堆栈大小的链接。

没有递归的DFS:

std::stack<Node> dfs;
dfs.push(start);
do {
    Node top = dfs.top();
    if (top is what we are looking for) {
       break;
    }
    dfs.pop();
    for (outgoing nodes from top) {
        dfs.push(outgoing node);
    }
} while (!dfs.empty())
Andreas Brinck answered 2019-08-13T05:59:04Z
40 votes

线程的堆栈通常较小。您可以在链接时更改默认值,或者在运行时改变。作为参考,一些默认值是:

  • glibc i386,x86_64 7.4 MB
  • Tru64 5.1 5.2 MB
  • Cygwin 1.8 MB
  • Solaris 7..10 1 MB
  • MacOS X 10.5 460 KB
  • AIX 5 98 KB
  • OpenBSD 4.0 64 KB
  • HP-UX 11 16 KB
pixelbeat answered 2019-08-13T06:00:31Z
14 votes

依赖于平台,依赖于工具链,依赖于ulimit,依赖于参数....它根本没有指定,并且有许多静态和动态属性可以影响它。

DrPizza answered 2019-08-13T06:01:01Z
4 votes

是的,存在堆栈溢出的可能性。 C和C ++标准没有规定像堆栈深度这样的东西,这些通常是一个环境问题。

大多数体面的开发环境和/或操作系统都可以让您在链接或加载时定制进程的堆栈大小。

您应该指定您使用哪种操作系统和开发环境以获得更有针对性的帮助。

例如,在Ubuntu Karmic Koala下,gcc的默认值是2M保留并且4K已提交,但是当您链接程序时可以更改它。 使用--stack选项ld来执行此操作。

paxdiablo answered 2019-08-13T06:01:52Z
3 votes

我刚刚在工作中耗尽了堆栈,它是一个数据库并且它运行了一些线程,基本上以前的开发人员已经在堆栈上抛出了一个大数组,而且堆栈仍然很低。 该软件使用Microsoft Visual Studio 2015编译。

即使线程已经耗尽堆栈,它仍然无声地失败并继续,它只是在访问堆栈上的数据内容时堆栈溢出。

我能给出的最好的建议是不在堆栈上声明数组 - 特别是在复杂的应用程序中,特别是在线程中,而是使用堆。 这就是它的用途;)

另外请记住,在声明堆栈时可能不会立即失败,但仅限于访问时。 我的猜测是编译器声明堆栈在windows&#34;乐观地&#34;,即它将假定堆栈已被声明并且具有足够的大小直到它使用它然后发现堆栈不是&#39; 在那里。

不同的操作系统可能具有不同的堆栈声明策略 如果您知道这些政策是什么,请发表评论。

Owl answered 2019-08-13T06:02:54Z
2 votes

我不确定你在矩形阵列上进行深度优先搜索是什么意思,但我假设你知道你在做什么。

如果堆栈限制是一个问题,您应该能够将递归解决方案转换为将中间值推送到从堆分配的堆栈的迭代解决方案。

Dave Kirby answered 2019-08-13T06:03:28Z
translate from https://stackoverflow.com:/questions/1825964/c-c-maximum-stack-size-of-program