局部变量和尾部调用优化
Local variables and tail call optimization
我想了解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;
}
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++延迟后的优化器调用函数
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 在循环条件中调用const vector size()似乎缺少优化
- C++编译器可以优化对 at() 的调用吗?
- 编译器 虚拟函数调用的优化
- 如何应用尾部调用优化
- 根据全局日志级别优化日志函数调用
- C++:优化析构函数调用
- 优化调用一系列功能指针
- 尾部调用优化是否适用于此功能?
- 对 constexpr 与内联函数的调用编译为不同的程序集,并禁用优化
- 为什么 noreturn/__builtin_unreachable 会阻止尾部调用优化
- 优化替换共享指针内容时对分配器的调用
- 从 optim.c 调用 BFGS 优化C++
- 我无法获得由 Clang 构建的优化 NDK 应用程序的调用堆栈
- 编译器可以优化方法调用吗?
- 对模板类 (N)RVO 优化调用的析构函数过多
- 从c#优化c++调用