关于尾递归优化

5
我使用以下两个函数来测试MSVC08下的尾递归优化:
int TailRecursively1(int i)
{
  return TailRecursively1(i);
}

int TailRecursively2(std::string str)
{
  return TailRecursively2(str);
}

为什么TailRecursively1被优化了,但是TailRecursively2导致了堆栈溢出?

4
第二个函数不是尾递归的。在递归后有一个析构函数的调用。 - sdkljhdf hda
@lego:看起来很有可能,而且也很容易检查,那么TailRecursively3(std::string&)呢(注意&)? - Matthieu M.
如果字符串通过引用传递,则 int TailRec(std::string& s) { return TailRec(s); } 是尾递归的 - 递归后没有剩余操作需要执行。 - sdkljhdf hda
1个回答

5
当将str参数通过值传递到TailReucrsively2时,会调用std::string复制构造函数和析构函数。 (我不完全确定)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接