Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;:递归中的堆栈溢出错误 何时在C++中递归产生堆栈溢出错误?使用递归时消耗的内存大小是多少?它是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针_C++_Recursion - Fatal编程技术网

c++;:递归中的堆栈溢出错误 何时在C++中递归产生堆栈溢出错误?使用递归时消耗的内存大小是多少?它是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针

c++;:递归中的堆栈溢出错误 何时在C++中递归产生堆栈溢出错误?使用递归时消耗的内存大小是多少?它是调用函数的4倍(4是指针的大小)?这是否意味着每个调用都有一个不同的指针,c++,recursion,C++,Recursion,每个平台对程序中可以使用的堆栈帧数量都有限制。当递归函数不能很快满足终止条件时,将导致堆栈溢出 在Microsoft Visual Studio编译器中,可以使用编译器选项/F(还有一个链接器选项,/stack)指定堆栈大小。如果没有这个,堆栈大小是1MB。您可以在上获得更多信息 每个堆栈帧需要不同的内存量——它们由局部变量的数量和类型、返回值的类型、参数的数量和类型决定。因此,在不导致堆栈溢出的情况下可以使用的堆栈帧的数量会有所不同 g++/gcc还可以使用-Wl-stack\u size指定

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

在Microsoft Visual Studio编译器中,可以使用编译器选项
/F
(还有一个链接器选项,
/stack
)指定堆栈大小。如果没有这个,堆栈大小是1MB。您可以在上获得更多信息

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


g++/gcc还可以使用
-Wl-stack\u size
指定堆栈大小。您可以在上找到关于这个主题的更多信息。

C++语言没有“堆栈”或“堆栈溢出”的概念

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

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

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


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

您可能需要对堆栈进行一些阅读,这是一个坚实的开端。可能重复