局部变量和尾调用优化

时间:2014-06-23 14:17:51

标签: c++ scope tail-recursion

我想了解尾调用优化在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-branch:创建一个新的std::string实例,并将其内部缓冲区用作下一次调用的输入。如果发生尾调用优化,并且没有创建新的堆栈帧,这不会导致错误,因为本地变量str将在下一次调用之前被销毁吗?

2 个答案:

答案 0 :(得分:2)

C ++下的尾调优化属于C ++编译器的as-if优化自由。

如果编译器在高级别上非常详细地了解std::string,那么你所做的将阻止尾调用优化,因为在递归调用完成后需要调用非平凡的析构函数。

答案 1 :(得分:0)

首先,在这种情况下,您希望摆脱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;
}