c ++:递归中的stackoverflow错误

时间:2014-08-14 05:53:28

标签: c++ recursion

什么时候在c ++的递归中导致堆栈溢出错误?使用递归时消耗的内存大小是多少?是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针?

2 个答案:

答案 0 :(得分:2)

每个平台都限制您可以在程序中使用的堆栈帧数。当递归函数不能很快满足其终止条件时,它将导致堆栈溢出。

在Microsoft Visual Studio编译器中,您可以使用编译器选项/F指定堆栈大小(还有一个链接器选项/STACK)。如果没有这个,堆栈大小为1 MB。您可以在http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx获取更多信息。

每个堆栈帧需要不同的内存量 - 它们由局部变量的数量和类型,返回值的类型,参数的数量和类型决定。因此,您可以使用而不会导致堆栈溢出的堆栈帧数会有所不同。

g ++ / gcc也有一种使用-Wl-stack_size指定堆栈大小的方法。您可以在Change stack size for a C++ application in Linux during compilation with GNU compiler找到有关该主题的更多信息。

答案 1 :(得分:0)

C ++作为一种语言没有“堆栈”或“堆栈溢出”的概念。

堆栈是一个实现细节。每次调用所消耗的数量取决于您的平台,编译器,实际代码等。根据经验,您可以期望将返回地址和所有函数的参数压入堆栈。此外,自动变量通常存在于堆栈中(但见下文)。

然而,这是一种简化:在某些情况下,编译器可能完全消除函数调用或turn them into jump instructions。参数通常在寄存器中传递。自动变量可以优化或存储在寄存器中。等等。

如果您想确切知道,请将代码编译为汇编并仔细研究结果。或者,安装一些有代表性的基准测试并运行它们直到堆栈耗尽。

最后但同样重要的是,应用程序可用的堆栈数量通常可在操作系统级别进行配置。