Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++ - Fatal编程技术网

C++ 当使用参数进行递归调用时,堆栈中会发生什么?

C++ 当使用参数进行递归调用时,堆栈中会发生什么?,c++,C++,处理创建无限递归的情况。在函数中,一个长字符串作为参数传递。当然,这将导致堆栈溢出。我只是想知道,对于带有参数的递归调用,堆栈的行为如何。它只是在每次递归时将参数放入堆栈吗?如果不确切了解哪个编译器和哪个参数,很难说清楚 参数可以在堆栈上,也可以在寄存器中(但很可能在下一次调用之前,寄存器需要保存在调用内部)。其他东西也会占用堆栈空间 大多数现代系统还将添加对齐,以确保堆栈与X字节(通常为16或32)对齐,例如,MS编译器还将在调试模式下添加额外的“检查变量外部是否覆盖”填充 当然,函数调用需要

处理创建无限递归的情况。在函数中,一个长字符串作为参数传递。当然,这将导致堆栈溢出。我只是想知道,对于带有参数的递归调用,堆栈的行为如何。它只是在每次递归时将参数放入堆栈吗?

如果不确切了解哪个编译器和哪个参数,很难说清楚

参数可以在堆栈上,也可以在寄存器中(但很可能在下一次调用之前,寄存器需要保存在调用内部)。其他东西也会占用堆栈空间

大多数现代系统还将添加对齐,以确保堆栈与X字节(通常为16或32)对齐,例如,MS编译器还将在调试模式下添加额外的“检查变量外部是否覆盖”填充

当然,函数调用需要一个返回地址,尽管有些处理器可以将返回地址存储在寄存器中,但需要保存该寄存器。可能还需要一个“帧指针”来跟踪局部变量的位置,当然,如果函数有局部变量,这些变量也会在每次迭代的堆栈上

如果代码足够复杂[这并不一定意味着特别复杂],编译器可能需要使用它必须通过堆栈保存和恢复的寄存器

另一方面,一些编译器会将“尾部递归”更改为简单循环

简而言之,有很多因素会影响这一点,如果没有代码、编译器和编译器选项,几乎不可能确定实际发生了什么

我只是想知道堆栈对递归调用的行为 参数。它是否只是每隔一天将参数放入堆栈 递归

通常没有“行为”差异

递归函数的未优化代码中的递归调用(具有一个或多个参数)的处理方式与具有相同参数的任何其他函数(或方法)调用的处理方式相同

在正确构造的尾部递归中,我看到(并且可能找到一个例子)编译器可以优化调用/返回。参数push、jump和return折叠为循环


将高度优化的递归代码与高度优化的非递归代码进行比较可能是一个挑战。

是的,确实如此。它还能放在哪里呢?递归调用和任何其他调用之间没有区别。所有参数通常都放在堆栈上。堆栈帧更大,因此您可以更快地调试错误:)