同级呼叫不会出现在堆栈跟踪中吗?

时间:2019-03-24 21:50:18

标签: compiler-optimization stack-trace

我在stack traces上的Wikipedia文章中偶然发现了一行。

它说:

  

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

这到底是什么意思?我以为所有堆栈帧都出现在堆栈跟踪中。根据我的理解,即使有一个尾部调用,新的框架仍然会被推入堆栈,因此是可追溯的。有没有可以在运行中看到此示例的示例,而堆栈跟踪中未显示同级调用?

2 个答案:

答案 0 :(得分:2)

  

根据我的理解,即使有一个尾部调用,新的框架仍然会被压入堆栈,因此是可追踪的

您误会了。

来自Wikipedia

  

尾部调用无需在调用堆栈中添加新的堆栈框架即可实现。 [强调我的] 不再需要当前过程的大多数框架,并可以由尾部调用的框架替换,可以对其进行适当的修改(类似于过程的叠加层,但函数调用类似)。然后,程序可以跳转到被调用的子例程。产生这样的代码而不是标准的调用序列称为尾部调用消除。

由于“同级调用”只是尾调用的一种特殊情况,因此可以用相同的方式对其进行优化。在编译器可以优化其他尾调用的任何情况下,以及在上述Wikipedia文章中所述的那些特定示例中,您都应该能够看到此示例。

答案 1 :(得分:1)

根据该术语下的链接所导致的引理,

同级调用是“对采用和返回与调用者相同类型的函数的尾部调用”

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