c++;:递归中的堆栈溢出错误 何时在C++中递归产生堆栈溢出错误?使用递归时消耗的内存大小是多少?它是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针
每个平台对程序中可以使用的堆栈帧数量都有限制。当递归函数不能很快满足终止条件时,将导致堆栈溢出 在Microsoft Visual Studio编译器中,可以使用编译器选项c++;:递归中的堆栈溢出错误 何时在C++中递归产生堆栈溢出错误?使用递归时消耗的内存大小是多少?它是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针,c++,recursion,C++,Recursion,每个平台对程序中可以使用的堆栈帧数量都有限制。当递归函数不能很快满足终止条件时,将导致堆栈溢出 在Microsoft Visual Studio编译器中,可以使用编译器选项/F(还有一个链接器选项,/stack)指定堆栈大小。如果没有这个,堆栈大小是1MB。您可以在上获得更多信息 每个堆栈帧需要不同的内存量——它们由局部变量的数量和类型、返回值的类型、参数的数量和类型决定。因此,在不导致堆栈溢出的情况下可以使用的堆栈帧的数量会有所不同 g++/gcc还可以使用-Wl-stack\u size指定
/F
(还有一个链接器选项,/stack
)指定堆栈大小。如果没有这个,堆栈大小是1MB。您可以在上获得更多信息
每个堆栈帧需要不同的内存量——它们由局部变量的数量和类型、返回值的类型、参数的数量和类型决定。因此,在不导致堆栈溢出的情况下可以使用的堆栈帧的数量会有所不同
g++/gcc还可以使用
-Wl-stack\u size
指定堆栈大小。您可以在上找到关于这个主题的更多信息。C++语言没有“堆栈”或“堆栈溢出”的概念
堆栈是一个实现细节。每次调用的消耗量取决于您的平台、编译器、实际代码等。根据经验,您可以期望返回地址和函数的所有参数都被推送到堆栈上。此外,自动变量通常位于堆栈上(但请参见下文)
然而,这是一种简化:在某些情况下,编译器可能能够完全或完全消除函数调用。参数通常在寄存器中传递。自动变量可以优化或存储在寄存器中。等等
如果您想确定,请将代码编译成汇编并仔细研究结果。或者,装配一些具有代表性的基准测试并运行它们,直到堆栈耗尽
最后但并非最不重要的一点是,应用程序可用的堆栈数量通常可以在操作系统级别进行配置。您可能需要对堆栈进行一些阅读,这是一个坚实的开端。可能重复