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

OCaml中函数堆栈的大小是多少?,ocaml,Ocaml,如果我们不跟踪递归函数,ocaml将创建一个堆栈并将信息推送到内部。如果我们递归调用太多次,可能会出现堆栈溢出错误 那么门槛是多少?函数堆栈的大小是多少?我不确定这一点,但很明显,递归深度取决于您所讨论的函数。简单地考虑这两个非尾递归函数: 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;; 然后尝试

如果我们不跟踪递归函数,ocaml将创建一个堆栈并将信息推送到内部。如果我们递归调用太多次,可能会出现堆栈溢出错误


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

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

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。G00。这两个函数最终都会产生堆栈溢出,但后一个函数会更早地产生堆栈溢出


堆栈上可能有一定数量的字节可用。您可能可以通过查看f的移动距离以及在函数调用发生时到底推送到堆栈上的内容来近似这个数字。

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

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。G00。这两个函数最终都会产生堆栈溢出,但后一个函数会更早地产生堆栈溢出


堆栈上可能有一定数量的字节可用。您可能可以通过查看f的移动距离以及在函数调用发生时到底推送到堆栈上的内容来估计这个数字。

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

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


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

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

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


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

这真的重要吗?你为什么想知道这个?也许你会发现这很有趣:这真的重要吗?你为什么想知道这些?也许你会觉得这很有趣: