c++:递归中的stackoverflow错误

c++: stackoverflow error in recurssion

本文关键字:stackoverflow 错误 递归 c++      更新时间:2023-10-16

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

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

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

每个堆栈帧需要不同的内存量——它们由局部变量的数量和类型、返回值的类型、参数的数量和类型决定。因此,在不引起堆栈溢出的情况下可以使用的堆栈帧数各不相同。

g++/gcc也有一种使用-Wl-stack_size指定堆栈大小的方法。您可以在GNU编译器编译期间更改Linux中c++应用程序的堆栈大小中找到有关该主题的更多信息。

c++作为一门语言没有"堆栈"或"堆栈溢出"的概念。

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

然而,这是一种简化:在某些情况下,编译器可能能够完全消除函数调用或将其转换为跳转指令。参数通常在寄存器中传递。自动变量可以被优化掉或存储在寄存器中。等等。

如果你想知道确切的答案,把你的代码编译成汇编并仔细研究结果。或者,设置一些有代表性的基准测试并运行它们,直到堆栈耗尽。

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