2014-02-09 10 views
1

not-tail-recursive 함수를 수행하면 ocaml은 스택을 만들고 내부에 정보를 푸시합니다. 우리가 재귀 적으로 너무 많이 호출하면 stack overflow 오류를 얻을 수 있습니다.OCaml의 함수 스택의 크기는 얼마입니까?

임계 값은 무엇입니까? 함수 스택의 크기는 얼마입니까?

+0

정말 중요한가요? 왜 이걸 알고 싶니? –

+1

아마도이 흥미로운 것을 발견 할 것입니다 : http://caml.inria.fr/mantis/view.php?id=5465 – lukstafi

답변

3

바이트 코드 인터프리터의 경우 설명서에 기본 크기는 256k 단어라고 나와 있습니다. (wordsize는 시스템에 따라 32 또는 64 비트라고 생각합니다.) l 매개 변수를 OCAMLRUNPARAM 또는 GC 모듈을 통해 조정할 수 있습니다.

네이티브 코드의 경우 설명서에 OS의 기본 규칙이 사용되었다고 나와 있습니다. 따라서 구현마다 다를 것입니다.

나는 지금 이것을 보았다. 나는 실제로는 알 필요가 없다. 일반적으로 stacksize 제한 근처의 코드를 작성하고 싶지 않습니다.

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이 얼마나 멀리 있는지보고이 함수의 호출이 발생할 때 스택에 정확히 무엇이 푸시되는지 조회함으로써이 숫자를 계산할 수 있습니다.

관련 문제