通过在堆上分配堆栈部分来避免堆栈溢出?

LP_

是否有一种语言可以启用一种机制,当超出原始堆栈空间时在堆上分配新的堆栈空间?

我记得在我的大学里做过一个实验室,在那里我们用C语言进行内联汇编来实现基于堆的可扩展堆栈,因此我知道原则上应该可行。

我了解开发应用程序时出现堆栈溢出错误可能很有用,因为它会迅速终止疯狂的无限递归而不会使您的系统占用大量内存并开始交换。

但是,当您要部署完成且经过测试的应用程序并且希望它尽可能强大时(例如,这是在台式计算机上运行的非常关键的程序),很高兴知道它不会在堆栈受限制的某些其他系统上,某些对象占用更多空间或程序遇到比测试中需要更多堆栈内存的非常特殊的情况时,该应用程序将失败。

我认为正是由于这些陷阱,生产代码中通常避免了递归。但是,如果我们有一种在生产代码中自动堆栈扩展的机制,那么我们将能够使用递归编写更优雅的程序,因为它知道当系统有16 GB的可用堆内存时不会出现意外的段错误...

迪特里希·埃普

有先例。

  • 用于Haskell编译器的GHC的运行时使用堆而不是堆栈。仅当您调用外来代码时才使用该堆栈。

  • Google的Go实施将分段堆栈用于goroutine,可根据需要扩大堆栈。

  • Mozilla的Rust曾经使用分段堆栈,尽管它决定导致的问题多于解决的问题(请参阅[rust-dev]在Rust中放弃分段堆栈)。

  • 如果提供内存,则某些Scheme实现会将堆栈帧放在堆上,然后像其他对象一样对这些帧进行垃圾回收。

在传统的命令式语言编程风格中,大多数代码将避免递归调用自身。堆栈溢出很少在野外看到,它们通常是由草率的编程或恶意输入触发的,尤其是递归下降解析器等,这就是为什么当嵌套超过阈值时某些解析器会拒绝代码的原因。

避免生产代码中堆栈溢出的传统建议:

  1. 不要编写递归代码。(示例:重写搜索算法以使用显式堆栈。)

  2. 如果您确实编写了递归代码,请证明递归是有界的。(示例:搜索平衡树以树的大小的对数为界。)

  3. 如果您无法证明它是无界的,请为其添加一个边界。(示例:为解析器支持的嵌套数量增加一个限制。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过使用setTimeout避免堆栈溢出

来自分类Dev

处理/避免C中的堆栈溢出

来自分类Dev

堆上堆栈类的结构

来自分类Dev

在堆栈和堆上分配对象之间的区别

来自分类Dev

Java变量放在堆栈或堆上

来自分类Dev

避免在基于承诺的循环中递归堆栈溢出?

来自分类Dev

如何避免此异步/等待程序中可能的堆栈溢出?

来自分类Dev

在动态时间规整中避免堆栈溢出的技术

来自分类Dev

使用scalaz的免费monad时如何避免堆栈溢出?

来自分类Dev

如何避免递归函数中尾部和蹦床的堆栈溢出?

来自分类Dev

使用R中的Ackermann函数避免堆栈溢出

来自分类Dev

如何在稳定的Rust中不占用堆栈空间的情况下在堆上分配结构?

来自分类Dev

robovm可以在堆栈而不是堆上分配本地方法对象吗?

来自分类Dev

Spark SQL堆栈溢出

来自分类Dev

堆栈溢出而不是死锁

来自分类Dev

UnmarshalJSON导致堆栈溢出

来自分类Dev

堆栈溢出损坏%ebp

来自分类Dev

调查线程堆栈溢出

来自分类Dev

堆栈溢出的可能原因

来自分类Dev

函数调用堆栈溢出

来自分类Dev

调查线程堆栈溢出

来自分类Dev

堆栈溢出java

来自分类Dev

Java Quicksort堆栈溢出

来自分类Dev

找到堆栈溢出

来自分类Dev

Android堆栈溢出(getIntrinsicHeight)

来自分类Dev

处理中的堆栈溢出

来自分类Dev

递归调用溢出堆栈

来自分类Dev

DFS导致堆栈溢出

来自分类Dev

Scrapy堆栈的请求溢出