OCaml中函数堆栈的大小是多少?

时间:2014-02-09 22:19:55

标签: ocaml

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

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

2 个答案:

答案 0 :(得分:3)

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

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

我现在只看了这些事情;我从来不需要在实践中知道。通常我不想编写任何接近stacksize限制的代码。

答案 1 :(得分:1)

我不确定这一点,但很明显递归深度取决于你所说的功能。只需考虑这两个(非尾递归)函数:

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走了多远来查看这个数字,并在函数调用发生时查找究竟是什么推入堆栈。

相关问题