2016-12-18 1 views
3

얼랑의 프로세스에 대한 루프를 만드는 일반적인 방법은 재귀를 사용하는 것입니다 루프? 다음 재귀 호출에서 가비지 수집됩니까? 새로운 변수를 선언하지 않아도 루프가 문제가되지 않으며 스택 오버 플로우가 발생할 수 있습니다. 한 루프에서 다른 루프로 끝없는 포인터를 얻을 수 있기 때문에 이론적으로는 어느 시점에서 다시 돌아 가야 할 수도 있습니다 ?얼랑 루핑 및 메모리 할당

답변

3

기술적으로 지역 변수는 Erlang에서 선언되지 않습니다. 그들은 가치에 묶여 있습니다. 지역 변수의 값은 스택에 저장됩니다. 일부 데이터 유형은 스택에 직접 저장 될 수 있으므로 힙에 할당 할 필요가 없습니다. 따라서 지역 변수는 가비지 컬렉션 될 필요는 없지만 일부 데이터 유형의 값은 있어야합니다. 어쨌든 이러한 값은 다음 재귀 호출에서 가비지 수집되지 않지만 힙이 스택을 충족하면 힙이 가득 찼으며 가비지 수집이 트리거됨을 의미합니다.

가장 중요한 점은 설명 된 방식으로 함수를 작성하면 재귀 호출 및 매개 변수가 "레지스터"에 저장되기 전에 스택 프레임이 해제된다는 것입니다. 다음 재귀 호출은 함수 호출이 아니라 점프 만합니다. 스택이 늘어나지 않는다는 뜻입니다. 힙에 할당되고 더 이상 스택이나 함수 매개 변수에 의해 참조되지 않는 모든 값은 가비지 수집 될 수 있으므로 메모리 누수 또는 스택 오버플로가 발생하지 않습니다. 사실, 그것은 매우 간단하고 우아한 솔루션입니다.