2010-02-24 3 views
4

이 웹 사이트에 대한 의견을 명확히하기 위해 글을 쓰고 있습니다.타사 가비지 수집기에서 사용되는 방법

1) C++에는 가비지 수집기가 없습니다. 하나는 C++가 가비지 컬렉터에 대한 아이디어보다 먼저 발명되었다고했기 때문에 그 이유가 있습니다. 그게 사실이야? 나는 그것이 합리적이라고 생각한다.

2) 가비지 컬렉터가 논의 될 때마다 스마트 포인트 (예 : boost :: share_ptr)가 나왔습니다. 레퍼런스 카운팅은 가비지 수집기를 구현하는 한 가지 방법이라고 확신했지만, 일부는 스마트 포인트가 가비지 수집기의 구현이 아니라고 말했습니다. 무슨 일이야?

3) 가비지 컬렉터가 C++에 포함되지 않은 이유는 어렵고 많은 문제를 해결할 수 없었기 때문입니다. 그러나 타사 가비지 컬렉터는 상업용이든 무료이든 관계없이 사용할 수 있다고 다른 사람이 말했습니다. 그렇다면이 제 3 자도 문제를 어떻게 처리할까요?

누구든지 내 혼란을 명확히 할 수 있다면 감사드립니다.

감사합니다. (1)과 낮은 수준의 2에 관해서

답변

4
  1. 아니요, 가비지 수집은 C++보다 훨씬 오래되었습니다 (특히 많은 Lisp 버전에서 '60 년대에 많이 사용됨).

  2. 참조 카운팅은 가비지 수집을 구현하는 방법이지만 성능이 현저히 떨어집니다 (새로운 Unladen Swallow 프로젝트는 CPython 인터프리터를 가속화하기 위해 참조 카운팅에서 더 나은 가비지 수집 구현으로 이동하는 것을 포함합니다. 성능 향상).

  3. C와 C에 대한 Boehm 컬렉터 ++ 보수적 접근 방식을 사용 : 잠깐, 주소가 (이 "점을"수집되지 않습니다 수도 있으므로 무엇이든) 하나를 보낸다처럼 보이는 것을. 주제에 대한 더 많은 정보를 얻으려면 내가 준 URL에서 페이지를 읽으십시오.

+2

"어떤 언어가 처음으로 기능 X를 가졌습니다"에 대한 유일한 대답은 Lisp, Smalltalk입니다. – Jimmy

+0

@ 지미, "대수 표현 구문이있는 첫 번째 언어", 포트란; "블록 구조와 어휘 범위를 가진 첫 번째 언어", Algol (Scheme은 Algol과 Scheme의 다른 Lisps로부터 그것을 복사했습니다); "고유 한 특수 문자 세트가있는 모국어", APL; ... ;-) –

0

http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29에 따르면 가비지 수집은 1959 년에 만들어 졌기 때문에 C++보다 훨씬 앞선 것입니다.

C++에서 가비지 수집기를 포함하지 않는 이유는 프로그래머가 C에서 상속받은 메모리를 관리하기 때문입니다. 가비지 수집기는 메모리 관리가 수행되는 언어의 일부입니다. 하나를 구현할 수 있지만 구현을 사용하여 모든 메모리 액세스를 관리해야합니다. 그렇지 않으면이를 피할 수 있습니다. 간단히 말해서, GC는 사용자가 속한 언어와 시스템의 기본 메모리 사이에있는 계층의 일부입니다.

0

가비지 수집을위한 최소 지원 - 다음가 아닌 C++ 표준 (비공식적으로 C++ 0x라고 함)에 가비지 수집기가 추가되지 않습니다. 여기에 대한 좋은 종이입니다 : 알렉스가 지적한 바와 같이 C++가 발명되기 훨씬 이전부터 http://www.hpl.hp.com/techreports/2009/HPL-2009-360.pdf

3
  1. 것은, LISP는 가비지 수집을했다. OTOH의 초기 구현 중 일부는 참조 카운팅을 사용했습니다.

  2. 가비지 수집을 논의하는 대부분의 사람들은 숨겨진 것을 생각하고 있습니다. 참조 횟수에는 여러 가지 문제가 있습니다. 그것은 수 있습니다 성능 문제가 있지만 개체가 일반적으로 C++에서 사용되는 것처럼 거의 않습니다. 훨씬 더 큰 문제는 참조 계산이 일반적으로 데이터의주기를 잘 다루지 않는다는 것입니다. 간단한 예를 들면 다음과 같습니다.

    struct node { node * next; };

    node * node1 = 새 노드, node2 = 새 노드;

    node1-> next = node2; node2-> next = node1;

    각 노드는 이제 다른 노드를 참조하기 때문에 참조 카운트는 아무 것도 언급하지 않은 경우에도 0이 아닙니다. 그들이 접근 할 수 없게 된 후에도 수집되지 않습니다. 그러나이 문제는 극복할만한 것입니다.

  3. C + +에서 타사 가비지 수집기를 사용하면 결과적으로 C++을 더 이상 준수하지 않습니다. 예를 들어 포인터를 "뒤집어 쓴다"(예 : 모든 비트를 반전) 경우 GC는 포인터가 가리키는 점을 인식하지 못합니다. 당신이 "un-swizzle"할 때 (비트 플랩) 그것이 가리킨 것은 더 이상 존재하지 않을 수 있습니다. 그러나 실제 코드의 문제는 사람들이 GC를 아무런 문제없이 정기적으로 사용하는 것은 매우 드문 경우입니다.

    OTOH 또한 제한 사항이 있으므로 C 및 C++ 용 가비지 수집기는 실제로 제대로 작동하지 않습니다. 가장 최근의 GC 디자인은 여전히 ​​존재하는 개체를 복사하여 작동하므로 GC주기가 경과 한 후에는 모두 힙에 인접합니다. 이렇게하려면 새 주소를 가리 키도록 해당 개체에 대한 모든 포인터를 "수정"해야합니다. GC는 C 또는 C++로 무엇이 포인터인지 알지 못하기 때문에 어떤 것이 포인터가 아닌 경우에는 수정할 수 없기 때문에 개체를 제자리에 남겨 두어야 성능이 저하됩니다.

GC를 C++에 추가하는 것에 대해 심각한 논의가있었습니다. Two comp.lang.C++. moderated threads 흥미로울 것입니다. 경고 : 그들은 꽤 길며 몇 가지 주장이 몇 번 반복됩니다. OTOH, 그들은 실제 문제와 가능한 해결책을 지적합니다.

+0

고마워요! 귀하의 의견은 높이 평가됩니다. – skydoor

관련 문제