【发布时间】:2018-02-03 10:56:11
【问题描述】:
来自Programming Language Pragmatics, by Scott,关于内联和递归:
在一般情况下,内联扩展也不是一个选项 递归子程序。对于递归的偶尔情况 调用是可能的,但不太可能,可能需要生成一个真实的 递归子例程,但扩展该例程的一级 在每个呼叫站点在线。
作为一个简单的例子,考虑一棵二叉树,它的叶子包含 字符串。返回这棵树的边缘的例程( 从左到右连接其叶子中的值)可能看起来 像这样在 C++ 中:
string fringe(bin_tree *t) { // assume both children are nil or neither is if (t->left == 0) return t->val; return fringe(t->left) + fringe(t->right); }如果编译器使每个嵌套调用成为真正的子例程调用,则编译器可以内联扩展此代码。由于二进制中的一半节点 树是叶子,这种扩展将消除一半的动态调用 在运行时。
如果我们不仅扩展根调用,而且扩展(一层)这两个 在真正的子程序版本中调用,只有四分之一 原始动态调用将保留。
我无法理解以下句子:
- “在每个呼叫站点在线扩展该例程的一级”
- “如果此代码使每个嵌套调用成为真正的子例程调用,则行内扩展此代码。”
- “在真正的子程序版本中,不仅扩展根调用,而且扩展两个调用(一层)”
它们实际上是什么意思?你能用给定的例子来解释它们吗,例如,展示每个句子的动作后的代码是什么样的?
谢谢。
【问题讨论】:
-
代码完全一样,但编译器可以决定内联一次调用,并保留同一函数的非内联版本。
标签: c++ recursion programming-languages inline computer-science