首页 > 解决方案 > 兄弟调用不会出现在堆栈跟踪中?

问题描述

我刚刚偶然发现了 Wikipedia 文章中关于堆栈跟踪的一行。

它说:

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

这到底是什么意思?我认为所有堆栈帧都出现在堆栈跟踪中。据我了解,即使有尾调用,新帧仍会被推入堆栈,因此是可追踪的。有没有一个例子可以让我看到这一点,其中兄弟调用未显示在堆栈跟踪中?

标签: compiler-optimizationstack-trace

解决方案


据我了解,即使有尾调用,新帧仍会被推入堆栈,因此是可追溯的

你误会了。

来自维基百科

尾调用可以在不向调用堆栈添加新堆栈帧的情况下实现。 【强调我的】当前程序的大部分frame已经不需要了,可以用tail call的frame代替,酌情修改(类似overlay对于进程,但是对于函数调用)。然后程序可以跳转到被调用的子程序。生成这样的代码而不是标准调用序列称为尾调用消除。

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


推荐阅读