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

我想在一个100 X 100arrays上做DFS。 (说数组的元素表示graphics节点)因此,假设最坏的情况下,recursion函数调用的深度可以高达10000,每个调用占据20个字节。 那么可行的方法是否有可能的stackoverflow?

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

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

一般限制是什么?

在Visual Studio中,我认为默认的堆栈大小是1MB,所以在recursion深度为10.000的情况下,每个堆栈帧最多可以是〜100个字节,这对于DFSalgorithm应该是足够的。

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

这里有一个默认的gcc 链接大小的链接 。

DFS没有recursion:

 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()) 

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

  • 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

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

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

大多数体面的开发环境和/或操作系统将允许您在链接或加载时调整stream程的堆栈大小。

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

例如,在Ubuntu Karmic Koala下,gcc的默认值是2M保留,4K已经提交,但在链接程序时可以更改。 使用ld--stack选项来做到这一点。

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

如果堆栈限制是一个问题,您应该能够将您的recursion解决scheme转换为迭代解决scheme,将中间值推入堆栈中分配的堆栈中。

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

即使线程已经用完了堆栈,它仍然会失败并继续运行,只有在访问堆栈上的数据的内容时才会溢出堆栈。

我可以给出的最好的build议是不要在栈上声明数组 – 特别是在复杂的应用程序中,特别是在线程中,而不是使用堆。 这就是它的目的;)

另外请记住,声明堆栈时可能不会立即失败,但只能在访问时失败。 我的猜测是,编译器会在“乐观”的窗口下声明堆栈,也就是说,它会假设堆栈已经被声明并且大小合适,直到使用它,然后发现堆栈不在那里。

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