我已经使用 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();
}
最佳答案
vector<unsigned>
的析构函数返回后需要调用参数。
关于c++ - 这可以优化尾调用吗?如果是这样,它没有发生的特殊原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19007707/