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议是不要在栈上声明数组 – 特别是在复杂的应用程序中,特别是在线程中,而不是使用堆。 这就是它的目的;)
另外请记住,声明堆栈时可能不会立即失败,但只能在访问时失败。 我的猜测是,编译器会在“乐观”的窗口下声明堆栈,也就是说,它会假设堆栈已经被声明并且大小合适,直到使用它,然后发现堆栈不在那里。
不同的操作系统可能有不同的堆栈声明策略。 如果您知道这些政策是什么,请留下评论。