在我看来,在C和C ++中执行尾递归优化将非常有效,但是在调试时,我似乎从未看到指示这种优化的帧堆栈。这很好,因为堆栈告诉我递归的深度。但是,优化也会很好。
是否有任何C ++编译器都进行了此优化?为什么?为什么不?
如何告诉编译器执行此操作?
- 对于MSVC:
/O2
或/Ox
- 对于海湾合作委员会:
-O2
或-O3
在某些情况下,检查编译器是否已执行此操作呢?
- 对于MSVC,启用PDB输出以能够跟踪代码,然后检查代码
- 对于海湾合作委员会..?
我仍然会建议如何确定某个函数是否通过编译器进行了优化(即使我放心Konrad告诉我假设也是如此)。
总是可以通过进行无限递归检查编译器是否完全做到了这一点,并检查它是否导致无限循环或堆栈溢出(我用GCC这样做并发现-O2
足够了),但是我想能够检查某个我知道会终止的功能。我希望有一个简单的方法来检查这个:)
经过一些测试,我发现析构函数破坏了进行此优化的可能性。有时更改某些变量和临时变量的范围以确保它们在返回语句开始之前超出范围是值得的。
如果在尾调用之后需要运行任何析构函数,则无法完成尾调用优化。