最佳答案
在我看来,在 C 和 C + + 中进行尾部递归优化完全可行,但在调试时,我似乎从未看到指示这种优化的框架堆栈。这很好,因为堆栈告诉我递归有多深。然而,这种优化也是不错的。
是否有任何 C + + 编译器做这种优化? 为什么? 为什么不?
我如何告诉编译器这样做呢?
/O2
或 /Ox
-O2
或 -O3
如何检查编译器是否已经在某种情况下这样做?
对于如何确定某个函数是否被编译器像这样优化,我仍然需要一些建议(尽管我发现 Konrad 告诉我去假设它,这让我感到安心)
通过执行无限递归并检查它是否导致无限循环或堆栈溢出(我用 GCC 执行了这个操作,发现 -O2
已经足够了) ,总是可以检查编译器是否完成了这项工作,但是我希望能够检查某个我知道无论如何都会终止的函数。我想有一个简单的方法来检查这个:)
经过一些测试后,我发现析构函数会破坏进行这种优化的可能性。有时候值得改变某些变量和临时变量的作用域,以确保它们在返回语句开始之前超出作用域。
如果在尾部调用之后需要运行任何析构函数,则不能执行尾部调用优化。