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