언급 한 텍스트와 예제는 오해의 소지가 있습니다. 튜플과 그 구성 요소는 프로젝트의 구성 요소 중 하나만 프로젝 팅하고 유지하는 경우 프로그램 수명 동안 유지되지 않습니다.
이들은 터플의 구조적 변형의 범위 내에서 최대로 유지 될 것이며, 이들은 일반적으로 수명이 짧다. 저는 개인적으로 그것이 그것이 실제로 문제가되는 것을 결코 발견하지 못했습니다.
let pair a b =
let ra = Array.make 1 a
and rb = Array.make 1 b in
let f r = Printf.printf "> finalised: %d\n%!" r.(0) in
Gc.finalise f ra;
Gc.finalise f rb;
(ra, rb)
let a =
let a, _ = pair 1 2 in
let _, _ = pair 3 4 in
a
let() =
Gc.full_major(); (* garbage collection *)
Printf.printf "Used: %d\n%!" a.(0)
a
쓰레기 수집 얻을 제외하고 당신은 그 모든 것을 볼 것입니다 : 당신은 약간에 예를 조정할 경우
는 점을 증명합니다. 최상위 정의는 쓰레기가 제대로 일을 수집합니다 :
let e, _ = pair 5 6
let() = Gc.full_major()
은 또한 그것은 내가 위에서 설명하는 최악의 시나리오입니다
Leo White 나에게 지적했다. 원래 예제의
a
이 표현식에서 두 번 이상 사용되면 다른 구성 요소는 gc'd가됩니다.
a
을 한 번만 사용하면 실제로 필요할 때까지 OCaml이 튜플에서 투영하지 않습니다. 예를 들어 프로젝션이
if
에서 수행되는 경우 프로젝션을 수행 할 필요가 없습니다. 이 최적화는 값의 수명을 연장 할 수는 있지만 원래의 범위를 벗어날 수는 없습니다.
그레고리, 로제타 코드에 대한 계정을 갖고 있습니까? 언급 한 섹션은 기본적으로 잘못되었으며 적절히 삭제해야합니다. 내 대답을 보라. –