编译器中的c++迭代vs递归优化

C++ iterative vs recursion optimizations in the compiler

本文关键字:vs 递归 优化 迭代 c++ 编译器      更新时间:2023-10-16

假设我有一个递归函数,它在到达基本情况/获得值之前多次调用自己,以便开始将其余部分展开到链中。编译器是否会将其优化为相同的代码,就像我要以迭代格式编写该函数一样?

这个问题的答案是"可能"。但是如果你真的想确保编译器不会让函数真正递归,那么你必须迭代地写它。

许多编译器可以检测到"尾递归"并将其转换为循环。但并不总是这样,也不总是和你自己把它写成迭代函数一样有效。

对于更复杂的情况,例如斐波那契数列(它不是一个简单的尾部递归函数),编译器通常很难真正意识到发生了什么,它不得不诉诸于实际递归,即使使其迭代是相当微不足道的。[当我在递归方法中尝试斐波那契时,我的结果比迭代方法差得多-表明编译器没有解决它-这是使用gcc,它通常在这些事情上相当聪明]。

也许吧,但是要注意c++的语义常常使它变得更加困难。这些析构函数在返回时被调用,这意味着很多看起来像尾部递归的东西其实不是。