局部变量和尾部调用优化

Local variables and tail call optimization

本文关键字:优化 调用 尾部 局部变量      更新时间:2023-10-16

我想了解c++中尾部调用优化的含义。考虑下面这段代码:

#include <iostream>
#include <string>
size_t mystrlen(const char* input, size_t size = 0){
    if(!*input){
        return size;
    }else{
        std::string str(input+1);
        return mystrlen(str.c_str(),size + 1);
    }
}
int main(void){
    std::cout << mystrlen("Foo") << std::endl; //3
}

mystrlen是一个(无用的)函数,用于计算提供的C字符串的长度。考虑一下else分支:创建一个新的std::string实例,并将其内部缓冲区用作下一次调用的输入。如果尾部调用优化发生,并且没有创建新的堆栈帧,这不会导致错误,因为局部变量str将在下一次调用发生之前被销毁?

c++下的尾部调用优化属于c++编译器所拥有的类似于优化的自由。

除非编译器在高层次上对std::string有非常详细的了解,否则您所做的将阻碍尾部调用优化,因为需要在递归调用完成后调用重要的析构函数。

首先,在本例中您想要删除std::string:

size_t mystrlen(const char* input, size_t size = 0) {
    if(!*input){
        return size;
    } else {
        return mystrlen(input + 1, size + 1);
    }
}

那么你可以看到你的尾部呼叫优化将简单地:

size_t mystrlen(const char* input) {
    size_t size = 0;
    while (!*(input + size)) ++size;
    return size;
}