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