2014-02-09 22 views
1

如果我們做了not-tail-recursive函數,ocaml會創建一個棧並在裏面推入信息。如果我們遞歸調用太多次,就有可能得到stack overflow錯誤。OCaml中函數堆棧的大小是多少?

那麼門檻是多少?函數堆棧的大小是多少?

+0

它真的很重要嗎?你爲什麼想知道這個? –

+1

也許你可能會覺得這很有趣:http://caml.inria.fr/mantis/view.php?id=5465 – lukstafi

回答

3

對於字節碼解釋器,文檔說默認大小是256k字。 (根據系統的不同,我認爲字數是32位或64位。)您可以使用OCAMLRUNPARAM中的l參數或通過GC模塊對其進行調整。

對於本地代碼,文檔說明使用了OS的本機約定。所以每個實現都會有所不同。

我現在只是看了這些東西;我從來不需要知道在實踐中。通常我不想編寫任何可以接近堆棧大小限制的代碼。

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的行進距離並查看發生函數調用時確切地將其壓入堆棧的方式來近似該數字。