在我看来,在C和C++中同时进行尾递归优化会非常好,但在调试过程中,我似乎从来没有看到一个框架堆栈来表示这种优化。这很好,因为堆栈告诉我递归有多深。然而,优化也是很好的。
有没有C++编译器做过这样的优化?为什么?为什么不行?
我该如何告诉编译器这样做呢?
微软-O3
的
/O2
或 GCC:-O2
或MSVC如何检查编译器在特定情况下是否已经这样做了?
对于MSVC的
我仍然建议如何确定某个函数是否被编译器像这样优化(即使我发现Konrad告诉我假设它是可靠的)
始终可以通过进行无限递归并检查它是否会导致无限循环或堆栈溢出来检查编译器是否做到了这一点(我和GCC一起做了这件事,发现-O2
就足够了),但我希望能够检查某个我知道无论如何都会终止的函数。我希望有一个简单的方法来检查这一点:)
经过一些测试后,我发现析构函数破坏了进行这种优化的可能性。有时,更改某些变量和临时变量的作用域以确保它们在返回语句开始之前超出作用域是值得的。
如果在尾部调用之后需要运行任何析构函数,则无法进行尾部调用优化。
https://stackoverflow.com/questions/34125
复制相似问题