我想了解尾调用优化在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
将在下一次调用之前被销毁吗?
答案 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;
}