当前位置: 首页 > 面试题库 >

Go怎么没有堆栈溢出

楚泳
2023-03-14
问题内容

我在此演示文稿中阅读了http://golang.org/doc/ExpressivenessOfGo.pdf
第42页:

安全

-没有堆栈溢出

这怎么可能?和/或Go如何避免这种情况?


问题答案:

这是一个称为“分段堆栈”的功能:每个goroutine都有自己的堆栈,并在堆上分配。

在最简单的情况下,编程语言实现在每个进程/地址空间使用单个堆栈,通常通过称为pushpop(或类似名称)的特殊处理器指令进行管理,并实现为从固定地址(通常是固定地址)开始的动态堆栈帧数组。虚拟内存的顶部)。

那是(或曾经是)快速的,但是并不是特别安全。当在相同的地址空间(线程)中同时执行大量代码时,会引起麻烦。现在每个人都需要自己的堆栈。但是然后,所有堆栈(也许除外)都必须是固定大小的,以免它们彼此重叠或与堆重叠。

但是,使用堆栈的任何编程语言也可以通过以不同的方式管理堆栈来实现:通过使用列表数据结构或类似的方法来保存堆栈帧,但实际上是在堆栈上分配的。在堆满之前,没有堆栈溢出。



 类似资料:
  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy

  • (使用Java 15.0+) 我正在用这些实现一个堆栈 如何检查堆栈是否下溢?从Overflow boolean变量中,我们知道如果一个数字不能用8位来表示,就会导致溢出。但是,如果数字不能以这种方式表示,我们如何检查呢?我还认为应该有更多的情况下堆栈溢出,像jumpz或jumpn导致通过指令的无限循环。

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl