代码之家  ›  专栏  ›  技术社区  ›  rb612

同级调用不会出现在堆栈跟踪中?

  •  0
  • rb612  · 技术社区  · 5 年前

    我刚刚在维基百科的一篇关于 stack traces .

    上面写着:

    同级调用不会出现在堆栈跟踪中。

    这到底意味着什么?我以为所有的堆栈帧都出现在堆栈跟踪中。根据我的理解,即使有一个尾部调用,新的帧仍然被推到堆栈上,因此是可跟踪的。有没有一个例子可以让我看到这一点,在堆栈跟踪中没有显示同级调用?

    2 回复  |  直到 5 年前
        1
  •  2
  •   Peter Duniho    5 年前

    根据我的理解,即使有一个尾部调用,新的帧仍然被推到堆栈上,因此是可跟踪的

    你误解了。

    从…起 Wikipedia :

    尾部调用可以在不向调用堆栈添加新堆栈框架的情况下实现。 [强调我的] 当前过程的大部分框架不再需要,可以用尾部调用的框架替换,并根据需要进行修改(类似于进程的覆盖,但用于函数调用)。然后程序可以跳转到被调用的子例程。生成这样的代码而不是标准的调用序列称为尾部调用消除。

    由于“兄弟调用”只是尾部调用的一种特殊情况,因此可以用同样的方式对它们进行优化。在编译器优化其他尾部调用的任何场景中,以及上述维基百科文章中描述的特定示例中,您都应该能够看到这样的示例。

        2
  •  1
  •   CodeCaster    5 年前

    根据该术语下的链接所引出的引理,兄弟姐妹的呼叫是, “对采用和返回与调用方相同类型的函数的尾部调用” .

    uses a jump instead of a function call 使用当前堆栈帧。