编译器中的c++迭代vs递归优化
C++ iterative vs recursion optimizations in the compiler
假设我有一个递归函数,它在到达基本情况/获得值之前多次调用自己,以便开始将其余部分展开到链中。编译器是否会将其优化为相同的代码,就像我要以迭代格式编写该函数一样?
这个问题的答案是"可能"。但是如果你真的想确保编译器不会让函数真正递归,那么你必须迭代地写它。
许多编译器可以检测到"尾递归"并将其转换为循环。但并不总是这样,也不总是和你自己把它写成迭代函数一样有效。
对于更复杂的情况,例如斐波那契数列(它不是一个简单的尾部递归函数),编译器通常很难真正意识到发生了什么,它不得不诉诸于实际递归,即使使其迭代是相当微不足道的。[当我在递归方法中尝试斐波那契时,我的结果比迭代方法差得多-表明编译器没有解决它-这是使用gcc
,它通常在这些事情上相当聪明]。
也许吧,但是要注意c++的语义常常使它变得更加困难。这些析构函数在返回时被调用,这意味着很多看起来像尾部递归的东西其实不是。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- Qt vs Boost 文件系统递归文件计数
- std::swap 在 VS 2013 中导致无限递归
- 在递归函数中,堆上分配vs堆栈上分配
- 编译器中的c++迭代vs递归优化
- 获得所有向量元素组合的递归vs位掩码
- c++中的正向声明VS编译顺序错误,以避免包含递归标头