2017-03-23 4 views
3

double_array_tag 및 unboxed float를 런타임에 float array으로 표시하므로 가비지 수집기가 스캔하지 않습니다 (double_array_tag >= no_scan_tag).OCaml - int 배열과 가비지 콜렉션

하지만 int array은 무엇입니까? OCaml 가비지 컬렉터는 필드를 스캔하지 않는 것을 어떻게 알 수 있습니까?

답변

6

제대로 이해하면 가비지 수집기 int array의 필드를 검색합니다. 차례로 각 필드에 대해, 그것은 박스 화되지 않았고 더 이상 추구하지 않음을 알게 될 것입니다.

이 동작은 그리 효율적이지 않을 수 있습니다. 중요한 측면은 안전하다는 것입니다. float array의 경우 각 개인 float에 박스가없는 한 안전하지 않습니다 (차례로 공간이 비효율적입니다).

위의 (시간) 비 효율성이 문제가되는 경우 모듈 Bigarray이 해결책을 제공 할 수 있습니다.

+0

감사합니다. 그것은 내가 생각한대로입니다. 또 다른 특별한 표현 (int_array_tag)이 필요합니까? – pifu

+2

@pifu는 GC가 빠르지 만 배열 액세스가 느려지는 것을 의미합니다. 또한, 배열 표현을 곱하는 것은 OCaml 개발자가 (다시)하고 싶지 않은 무언가이다. 이것은 아무것도 바꿀 필요가없는 사람들, 배열 타입에서 float 배열 속임수를 꺼내기를 원하는 사람들과 당신과 유사한 제안을 가진 사람들 사이의 소스 코드를 탐구하는 사람들 사이에서 꽤 논란의 대상입니다. – PatJ

+0

@PatJ 감사합니다. OCaml 내부 구조가 꽤 잘 알고있는 것 같습니다. 어쩌면 당신은 이것 [다른 질문] (https://stackoverflow.com/questions/42486650/ocaml-representation-of-values-atoms)에 대답 할 수 있습니까? – pifu