我继承了一些我需要维护的代码,有时可能会低于稳定代码。以前的人不再可以查询为什么他们在无限堆栈设置的环境中运行应用程序,我很好奇这可能是什么影响?该应用程序似乎有一些我们无法找到的不可预测的内存错误,并且在Valgrind下运行应用程序不是一个选项,因为它会使应用程序速度降低太多以至于我们无法实际运行它。因此,任何关于这可能产生影响的想法都会受到赞赏。
答案 0 :(得分:2)
如果这是单线程标准类型的程序,限制堆栈大小实际上只是一个安全预防措施。它会阻止无限递归在它死之前吃掉所有的记忆。通过将限制设置为无限制,您将能够继续在堆栈上进行分配,直到它在堆上进行操作。
在经典的Unix方式中,堆和堆栈从内存空间的相对侧开始并相互分配,即一个成长而另一个成长。当它们命中时你不会得到错误,你只会覆盖数据直到发生不好的事情。
通常,您不需要大堆栈,但是在堆栈上分配大对象或深度递归可能是某些程序的问题,然后它们需要更大的堆栈。
编辑:只是为了增加关于单线程的观点。在多线程程序中,您需要分配多个堆栈。那种混淆了从两端到中间方式的增长。在那种情况下,堆栈从存储器空间的堆栈侧以max-stack-size-ish块分配。然后,当你打击你的堆栈时,你正在践踏另一个线程的堆栈。根据您的体系结构,您可以在其中添加一些页面保护以限制此情况,但此时可能是TMI; - )