在书中加速C++编程,205页上,有以下两个实施find
递归版本的“find”与不递归版本之间有什么区别?
template <class In, class X> In find(In begin, In end, const X& x)
我想知道是什么在性能方面有什么区别(不管实际上是相同的后编译?)以下两种实现。
非递归
template <class In, class X> In find(In begin, In end, const X& x)
{
while (begin != end && *begin != x)
++begin;
return begin;
}
递归
template <class In, class X> In find(In begin, In end, const X& x)
{
if (begin == end || *begin == x)
return begin;
begin++;
return find(begin, end, x);
}
通过使用编译器Explorer中建议通过Kerrek我得到了以下
非递归https://godbolt.org/g/waKUF2
递归https://godbolt.org/g/VKNnYZ
编译后好像完全一样? (如果我正确使用工具..对不起,我对C++非常陌生)
你为什么不试试两者,并告诉我们你发现了什么? –
尾递归可以导致很好的,干净的解决方案,但是您最好希望编译器将其优化为循环而不是递归(如果传递必要的优化标志,几乎所有编译器都会这样做,但如果优化可能不会关闭(如在调试版本中))。否则,如果搜索一个长列表,可能会导致堆栈溢出。 – Cornstalks
[示例](https://godbolt.org/g/Ql4X3d) –