【问题标题】:What's the size of the function stack in OCaml?OCaml 中函数栈的大小是多少?
【发布时间】:2014-02-09 22:19:55
【问题描述】:

如果我们执行not-tail-recursive 函数,ocaml 将创建一个堆栈并将信息推入其中。如果我们递归调用太多次,可能会得到stack overflow错误。

那么门槛是多少?函数栈的大小是多少?

【问题讨论】:

标签: ocaml


【解决方案1】:

对于字节码解释器,文档说默认大小是 256k 字。 (我认为 wordsize 是 32 位或 64 位,具体取决于系统。)您可以使用 OCAMLRUNPARAM 中的 l 参数或通过 GC 模块进行调整。

对于本机代码,文档说使用了操作系统的本机约定。因此,每个实现都会有所不同。

我现在才查了这些东西;在实践中我从来不需要知道。一般来说,我不想编写接近堆栈大小限制的代码。

【讨论】:

    【解决方案2】:

    我不确定这一点,但很明显,递归深度取决于您正在谈论的函数。简单考虑这两个(非尾递归)函数:

    let rec f x = print_int x; print_char '\n'; 1 + f (x+1);;
    let rec g x y z = print_int x; print_char '\n'; 1 + g (x+1) y z;;
    

    然后尝试f 0 resp。 g 0 0 0。这两个函数最终都会产生堆栈溢出,但后者 (g) 会“更早”地这样做。

    堆栈上可能有一定数量的可用字节。您可能可以通过查看f 走了多远并查看在发生函数调用时究竟推送到堆栈上的内容来近似这个数字。

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 2019-10-20
      • 2014-01-11
      • 1970-01-01
      • 2017-09-30
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多