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