c++ - 这可以优化尾调用吗?如果是这样,它没有发生的特殊原因是什么?

标签 c++ tail-recursion

我已经使用 gcc 4.8.1 和 clang 3.4.190255 检查了许多优化级别的汇编输出,没有针对此类代码的尾调用优化。

collat​​z_aux 没有得到尾调用优化的任何特殊原因?

#include <vector>
#include <cassert>

using namespace std;

vector<unsigned> concat(vector<unsigned> v, unsigned n) {
    v.push_back(n);
    return v;
}

vector<unsigned> collatz_aux(unsigned n, vector<unsigned> result) {
    return n == 1
        ? result
        : n % 2 == 0
            ? collatz_aux(n / 2, concat(move(result), n))
            : collatz_aux(3 * n + 1, concat(move(result), n));
}

vector<unsigned> collatz_vec(unsigned n) {
    assert(n != 0);
    return collatz_aux(n, {});
}

int main() {
    return collatz_vec(10).size();
}

最佳答案

vector<unsigned> 的析构函数返回后需要调用参数。

关于c++ - 这可以优化尾调用吗?如果是这样,它没有发生的特殊原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19007707/

相关文章:

c++ - 将函数指针从 Arduino 传递到 C++

c++ - 这个函数真的是尾递归的吗?

java - 按升序打印二进制数

javascript - BabelJS 是如何实现尾递归的?

c++ - 如何设计实时 CUDA 金融应用程序

c++ - 如何覆盖枚举的积分提升规则?

tree - 如何在序言中实现树算法的尾递归

匹配中的 Scala 尾递归优化

c++ - 如果满足条件或发生错误

c++ - 如何从 unsigned long 转换为 void*?