我在stack traces上的Wikipedia文章中偶然发现了一行。
它说:
同级调用不会出现在堆栈跟踪中。
这到底是什么意思?我以为所有堆栈帧都出现在堆栈跟踪中。根据我的理解,即使有一个尾部调用,新的框架仍然会被推入堆栈,因此是可追溯的。有没有可以在运行中看到此示例的示例,而堆栈跟踪中未显示同级调用?
答案 0 :(得分:2)
根据我的理解,即使有一个尾部调用,新的框架仍然会被压入堆栈,因此是可追踪的
您误会了。
来自Wikipedia:
尾部调用无需在调用堆栈中添加新的堆栈框架即可实现。 [强调我的] 不再需要当前过程的大多数框架,并可以由尾部调用的框架替换,可以对其进行适当的修改(类似于过程的叠加层,但函数调用类似)。然后,程序可以跳转到被调用的子例程。产生这样的代码而不是标准的调用序列称为尾部调用消除。
由于“同级调用”只是尾调用的一种特殊情况,因此可以用相同的方式对其进行优化。在编译器可以优化其他尾调用的任何情况下,以及在上述Wikipedia文章中所述的那些特定示例中,您都应该能够看到此示例。
答案 1 :(得分:1)
同级调用是“对采用和返回与调用者相同类型的函数的尾部调用” 。
此uses a jump instead of a function call使用当前的堆栈帧。