- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直想知道调用层次结构的最大深度是多少。如果我有一个大方法,在重构之后,我经常会得到这样的代码:
void A()
{
//...
B();
}
void B()
{
//...
C();
}
void C()
{
//...
}
最佳答案
简短回答:这一切都取决于 关于您的编程语言,以及您的程序在其上运行的机器的配置方式。
长答案 :
尽管可能存在机械限制,但没有理论限制。这与没有最大数字相同,但是对于您实际可以写下或存储在计算机内存中的数字的大小总是有限制的。
许多编程语言实现采用 call stack ,并且运行它们的机器通常在它们的指令集中明确支持这样的堆栈,您的程序最终将被转换为。堆栈是静态分配的内存区域,通常具有固定大小。每当您的程序进行方法调用时,机器都会将您程序中该位置的引用推送到堆栈中。方法调用完成后,机器可以在它停止的地方继续执行您的方法,并从堆栈中删除该“框架”。如果您的程序进行了大量嵌套调用,则可能需要将更多的帧插入堆栈,而不是有空间。这将导致您的程序崩溃并出现 堆栈溢出错误 .假设这是整个故事,“调用层次结构”深度的实际限制是程序调用堆栈的大小。
但这并不是故事的全部。如果调用另一个方法是一个方法所做的最后一件事(即它在尾部位置),那么没有理由将该调用压入堆栈,因为程序将不需要再次返回到那个位置。这种电话是tail call .将编写正确的编程语言实现,以便通过不将尾调用压入堆栈来尊重尾调用。这称为尾调用消除。在这种情况下,您的程序可以根据需要进行任意数量的嵌套调用,前提是它们位于尾部位置。您甚至可以编写无限递归的程序。
一些编程语言实现是无堆栈的,因此它们的执行模型根本不使用堆栈。然后他们会有一些中央执行机制来注册方法调用,比如 trampoline或可能由 thread pool 服务的执行队列.即使在传统上使用堆栈的语言中,您也可以自己使用这些技术来使您的程序无堆栈。
了解您的语言是否使用堆栈,您将如何配置其大小,以及它是否能够消除尾调用。
关于language-agnostic - 调用层次结构的最大深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562215/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!