|
|
1
116
当前所有主流编译器都执行尾部调用优化 相当不错(并且已经做了十多年), even for mutually recursive calls 例如:
让编译器进行优化很简单:只需打开速度优化:
检查编译器是否进行了优化的一个简单方法是执行一个调用,否则会导致堆栈溢出或查看程序集输出。 作为一个有趣的历史记录,在GCC中添加了C的尾部调用优化 diploma thesis 马克·普罗布斯特。本文描述了实现过程中一些有趣的注意事项。值得一读。 |
|
|
2
20
除了显而易见的(除非你要求,否则编译器不会进行这种优化)之外,C++中的尾部调用优化也很复杂:析构函数。 给出如下内容:
编译器(通常)不能通过尾部调用来优化它,因为它需要
调用析构函数
有时编译器可以看到析构函数没有外部可见的副作用(因此可以提前完成),但通常不能。
一种特别常见的形式是
|
|
|
3
11
gcc 4.3.2完全内联了这个函数(蹩脚/琐碎
|
|
|
4
10
大多数编译器在调试构建中不会进行任何优化。 如果使用VC,请尝试打开PDB信息的发布版本-这将让您跟踪优化的应用程序,您应该希望看到您想要的内容。然而,请注意,调试和跟踪优化的构建会让你四处奔波,而且通常你不能直接检查变量,因为它们只会出现在寄存器中或完全优化。这是一次“有趣”的经历。.. |
|
|
5
7
正如Greg提到的,编译器不会在调试模式下执行此操作。调试构建比prod构建慢是可以的,但它们不应该更频繁地崩溃:如果你依赖于尾部调用优化,它们可能会这样做。因此,最好将尾部调用重写为正常循环。 :-( |
|
|
Luiz Miranda · 尾递归pow-Erlang 7 年前 |
|
|
Srinivas · Scala中的尾部递归 8 年前 |
|
|
madtyn · Python:有可能使这个尾部递归阶乘更快吗? 8 年前 |
|
|
clay · Scala中的尾部递归findNextAndTail 8 年前 |
|
|
Sanitiy · 如何在调用另一个函数后强制函数退出? 8 年前 |
|
|
Lorinc Nyitrai · Lua-将协程递归重写为尾部调用递归 8 年前 |
|
|
Alex · 尾部递归调用(C primer加上书本示例) 9 年前 |
|
|
Thomas Ahle · 递归联合查找是否可以优化? 10 年前 |
|
|
beta Rob · 这个函数真的是尾部递归的吗? 12 年前 |