c++:递归中的stackoverflow错误
c++: stackoverflow error in recurssion
什么时候导致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++作为一门语言没有"堆栈"或"堆栈溢出"的概念。
堆栈是一个实现细节。每次调用所消耗的量取决于你的平台、编译器、实际代码等。根据经验,您可以期望返回地址和函数的所有参数都被压入堆栈。此外,自动变量通常存在于堆栈中(参见下文)。
然而,这是一种简化:在某些情况下,编译器可能能够完全消除函数调用或将其转换为跳转指令。参数通常在寄存器中传递。自动变量可以被优化掉或存储在寄存器中。等等。如果你想知道确切的答案,把你的代码编译成汇编并仔细研究结果。或者,设置一些有代表性的基准测试并运行它们,直到堆栈耗尽。
最后但并非最不重要的是,应用程序可用的堆栈数量通常是在操作系统级别可配置的。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- c++:递归中的stackoverflow错误
- 1百万数组中出现Stackoverflow错误
- Visual 3-way归并排序stackoverflow错误