gpt4 book ai didi

language-agnostic - 调用层次结构的最大深度

转载 作者:行者123 更新时间:2023-12-04 01:05:27 25 4
gpt4 key购买 nike

我一直想知道调用层次结构的最大深度是多少。如果我有一个大方法,在重构之后,我经常会得到这样的代码:

void A()
{
//...
B();
}

void B()
{
//...
C();
}

void C()
{
//...
}

所以我正在调用一个方法,该方法调用一个调用方法(等等)的方法 - 都在同一个类中。
有多少级别太多的经验法则? (对于这个问题,术语“调用层次结构”是否正确?)

如果我重构以便 A 以某种方式同时调用 B 和 C 会更好吗?

最佳答案

简短回答:这一切都取决于 关于您的编程语言,以及您的程序在其上运行的机器的配置方式。

长答案 :

尽管可能存在机械限制,但没有理论限制。这与没有最大数字相同,但是对于您实际可以写下或存储在计算机内存中的数字的大小总是有限制的。

许多编程语言实现采用 call stack ,并且运行它们的机器通常在它们的指令集中明确支持这样的堆栈,您的程序最终将被转换为。堆栈是静态分配的内存区域,通常具有固定大小。每当您的程序进行方法调用时,机器都会将您程序中该位置的引用推送到堆栈中。方法调用完成后,机器可以在它停止的地方继续执行您的方法,并从堆栈中删除该“框架”。如果您的程序进行了大量嵌套调用,则可能需要将更多的帧插入堆栈,而不是有空间。这将导致您的程序崩溃并出现 堆栈溢出错误 .假设这是整个故事,“调用层次结构”深度的实际限制是程序调用堆栈的大小。

但这并不是故事的全部。如果调用另一个方法是一个方法所做的最后一件事(即它在尾部位置),那么没有理由将该调用压入堆栈,因为程序将不需要再次返回到那个位置。这种电话是tail call .将编写正确的编程语言实现,以便通过不将尾调用压入堆栈来尊重尾调用。这称为尾调用消除。在这种情况下,您的程序可以根据需要进行任意数量的嵌套调用,前提是它们位于尾部位置。您甚至可以编写无限递归的程序。

一些编程语言实现是无堆栈的,因此它们的执行模型根本不使用堆栈。然后他们会有一些中央执行机制来注册方法调用,比如 trampoline或可能由 thread pool 服务的执行队列.即使在传统上使用堆栈的语言中,您也可以自己使用这些技术来使您的程序无堆栈。

了解您的语言是否使用堆栈,您将如何配置其大小,以及它是否能够消除尾调用。

关于language-agnostic - 调用层次结构的最大深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com