gpt4 book ai didi

c++ - 哪个(如果有的话)C++ 编译器进行尾递归优化?

转载 作者:太空宇宙 更新时间:2023-11-04 04:53:06 27 4
gpt4 key购买 nike

在我看来,在 C 和 C++ 中进行尾递归优化会非常好,但在调试时我似乎从来没有看到表明这种优化的帧堆栈。这很好,因为堆栈告诉我递归有多深。但是,优化也会很好。

是否有任何 C++ 编译器进行此优化?为什么?为什么不呢?

我该如何告诉编译器去做呢?

  • 对于 MSVC:/O2/Ox
  • 对于 GCC:-O2-O3

如何检查编译器是否在特定情况下执行了此操作?

  • 对于 MSVC,启用 PDB 输出以便能够跟踪代码,然后检查代码
  • 对于 GCC..?

我仍然会就如何确定编译器是否像这样优化某个函数提出建议(尽管我发现 Konrad 告诉我假设它让我放心)

总是可以通过进行无限递归并检查它是否导致无限循环或堆栈溢出来检查编译器是否完全这样做(我用 GCC 这样做并发现 -O2 就足够了),但我希望能够检查某个我知道无论如何都会终止的函数。我很想有一个简单的方法来检查这个:)


经过一些测试,我发现析构函数破坏了进行此优化的可能性。有时更改某些变量和临时变量的范围以确保它们在返回语句开始之前超出范围是值得的。

如果在尾调用之后需要运行任何析构函数,则无法进行尾调用优化。

最佳答案

当前所有主流编译器都很好地执行了尾调用优化(并且已经做了十多年),even for mutually recursive calls比如:

int bar(int, int);

int foo(int n, int acc) {
return (n == 0) ? acc : bar(n - 1, acc + 2);
}

int bar(int n, int acc) {
return (n == 0) ? acc : foo(n - 1, acc + 1);
}

让编译器进行优化很简单:只需打开优化速度即可:

  • 对于 MSVC,使用 /O2/Ox
  • 对于 GCC、Clang 和 ICC,使用 -O3

检查编译器是否进行了优化的一种简单方法是执行否则会导致堆栈溢出的调用,或者查看程序集输出。

作为一个有趣的历史记录,C 的尾调用优化在 diploma thesis 的过程中被添加到 GCC 中。马克·普罗布斯特。论文描述了实现中的一些有趣的注意事项。值得一读。

关于c++ - 哪个(如果有的话)C++ 编译器进行尾递归优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com