C++ 递归函数是否存在部分尾部调用优化?

C++ 递归函数是否存在部分尾部调用优化?,c++,recursion,optimization,tail-recursion,C++,Recursion,Optimization,Tail Recursion,如何在g++上对一个不完全是尾部递归的函数进行尾部调用优化 例如: void foo(Node *n) { if (n == nullptr) return; foo(n->left); cout << n->datum; foo(n->right); } void foo(节点*n){ 如果(n==nullptr)返回; foo(n->左); cout数据; foo(n->右); } 这是foo(n->left)不是尾部递归的

如何在g++上对一个不完全是尾部递归的函数进行尾部调用优化

例如:

void foo(Node *n) {
    if (n == nullptr) return;

    foo(n->left);
    cout << n->datum;
    foo(n->right);
}
void foo(节点*n){
如果(n==nullptr)返回;
foo(n->左);
cout数据;
foo(n->右);
}

这是foo(n->left)不是尾部递归的,但是foo(n->right)是。有什么方法可以优化它吗?

答案是:非常巧妙地询问编译器

C++规范允许编译器实现任何优化,只要可观察结果保持不变。


在所示代码中,部分尾部优化显然会产生相同的可观察结果。它是否真的发生,完全取决于您的编译器。C++规范不要求编译器在这里执行尾部优化,但也不禁止。这完全取决于编译器,在一个足够激进的优化级别上,很可能现代C++编译器会这样做。

如果你对此偏执狂,你总是可以将递归函数转换成迭代函数(只是要清楚,我不建议做它,只要指出它就行了)。在-O3上运行g++以避免执行任何递归(如果可以的话)。在O2上,它没有那么愚蠢,只是把第二次呼叫变成了一次跳转。