这可以优化尾部调用吗?如果是这样,它的特殊原因是什么?

pep*_*ico 8 c++ tail-recursion

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

有什么特殊原因collatz_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();
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ple 12

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