it-swarm-ko.com

C ++의 가비지 컬렉션 라이브러리

C++에 사용할 수있는 무료 및 상용 가비지 수집 라이브러리는 무엇이며 각각의 장단점은 무엇입니까?

마케팅이나 홍보 광고가 아닌 현장에서 실제로 사용하여 얻은 어려운 교훈에 관심이 있습니다.

자동 가비지 수집과 관련된 일반적인 트레이드 오프에 대해 자세히 설명 할 필요는 없지만 사용 된 알고리즘 (참조 카운팅, 마크 및 스윕, 증분 등)을 언급하고 그 결과를 간략하게 요약하십시오.

65
Andrew Bettison

나는 과거에 Boehm 수집가 를 성공적으로 사용했습니다. 오픈 소스이며 상용 소프트웨어에서 사용할 수 있습니다.

그것은 보수적 인 수집가이며, 가비지 수집 기술의 가장 뛰어난 연구자 중 한 명이 개발 한 오랜 역사를 가지고 있습니다.

27
Greg Hewgill

Boost는 스마트 포인터 의 광범위한 범위를 가지고 있으며 이는 참조 계산 또는 범위에서 삭제 종료 또는 침입 참조 계산을 의미합니다. 이것들은 우리의 필요에 충분히 입증되었습니다. 큰 장점은 모두 무료, 오픈 소스, 템플릿 기반 C++라는 것입니다. 참조 카운트이기 때문에 대부분의 경우 객체가 파괴 될 때 매우 결정적입니다.

22
Tom Leys

나는 boehm-gc를 많이 사용합니다. 사용하기는 간단하지만 문서는 정말 열악합니다. C++ 페이지가 있지만 찾기가 매우 어렵습니다.

기본적으로 모든 클래스가 기본 클래스에서 상속되는지 확인하고 항상 gc_allocator를 컨테이너에 전달합니다. 많은 경우에 libgccpp를 사용하여 new 및 delete의 다른 용도를 포착하려고합니다. 이는 대체로 높은 수준의 변경 사항이며 컴파일 타임에 #ifdef를 사용하여 GC를 끌 수 있으며이를 지원하는 것은 하나 또는 두 개의 파일에만 영향을줍니다.

내 주요 문제는 수집기를 먼저 끄지 않으면 더 이상 Valgrind를 사용할 수 없다는 것입니다. 수집기를 끄는 것은 쉬운 일이고 재 컴파일 할 필요가 없지만 메모리가 부족해지기 시작하면 사용하는 것은 분명히 불가능합니다.

9
Paul Biggar

The Boehm 가비지 수집기 무료로 사용할 수 있으며, 다소 좋습니다 (직접 경험하지 않음).

([PDF WARNING] Boehm 가비지 수집기에 대한 C++ 0x 제안 )에 대한 이론적 문서

원래 C++ 0x 을 만들 것이라고 말했지만 결국 만들지는 않을 것입니다 (내가 생각하는 시간 제약으로 인해).

Proprosal N267 (가비지 컬렉터에 대한 최소한의 지원)은 2008 년 6 월에 승인을 받았으므로 컴파일러 구현이이 문제를 해결하고 표준이 완성되면 C++ 용 가비지 컬렉션 세계는 확실합니다. 변화...

9
Pieter

C++에서 GC의 가장 큰 어려움은 GC 의미에서 비협조적인 모듈을 처리해야한다는 것입니다. 즉, GC를 염두에두고 작성되지 않은 라이브러리를 처리합니다.

이것이 Boehm GC가 종종 제안되는 이유입니다.

2
Arafangion

내가 아는 유일한 사람은 Boehm이며, 하단에는 전통적인 표시와 스윕이 있습니다. 이를 최적화하기 위해 다양한 기술을 사용할 수 있지만 일반적으로 증분/세대/압축 GC는 .Net C++로 얻을 수있는 것과 같은 관리되는 하위 집합을 사용하지 않고 C++ 용으로 만들기가 어렵습니다. 포인터를 이동하는 데 필요한 일부 접근 방식은 포인터 고정 또는 블록 읽기/쓰기에 대한 컴파일러 지원으로 구현할 수 있지만 성능에 대한 영향이 너무 클 수 있으며 반드시 GC에 대한 사소한 변경은 아닙니다.

2
larsivi

똑같은 물건을 찾고있는 상업용 제품이 있습니다.

HnxGC http://hnxgc.harnixworld.com/

과거에는 Geodesic Systems의 Great Circle이라는 제품도 있었지만 더 이상 판매하지 않는 것 같습니다. 다른 사람에게 제품을 판매했는지 알 수 없습니다.

1
Daniel Holmes

Microsoft의 Managed C++를 사용할 수도 있습니다. CLR 및 GC는 매우 견고하고 서버 제품에 사용되지만 GC가 실제로 수집하려면 CLR 유형을 사용해야합니다. 기존 코드를 다시 컴파일하고 모든 삭제 문을 제거 할 수는 없습니다.

저는 C #을 사용하여 새로운 코드를 작성하고 싶지만 Managed C++를 사용하면보다 점진적인 방식으로 코드 기반을 발전시킬 수 있습니다.

1
Remi Lemarchand

this 를 읽고 결론을 잘 살펴보십시오.

결론

  • 간단한 솔루션이 널리 사용되는 문제에 대한 복잡한 솔루션이며 C++ 0x에 의해 개선 될 것이므로 거의 필요하지 않습니다.
  • 표준화 할 권장 언어 기능에 대한 경험이 거의 없습니다.
  • 나쁜 소프트웨어 복잡한 시스템을 고치는 것은 결코 작동하지 않습니다.
  • 향후 GC 지원을 개선하기 위해 사소한 언어 변경을 권장합니다. 예를 들어 포인터 숨기기 (xor 목록 트릭)를 허용하지 않습니다.

  • 마지막으로 "C++는 GC가 없기 때문에 나쁘다"라는 인수를 정면으로 처리합니다. C++는 쓰레기를 생성하지 않으므로 GC 가 필요하지 않습니다. 분명히 Java, C #, Objective C 등은 많은 쓰레기를 생성합니다.

네, 마지막 문장은 주관적이며 또한 거룩한 전쟁의 일부입니다.
C++을 사용하는 이유는 누군가 나를 위해 쓰레기를 버려야한다는 생각이 싫기 때문입니다.
시청에서 그렇게했고 그 정도면 충분합니다.
GC가 필요한 경우 다른 언어를 사용하세요. 올바른 작업에 적합한 도구를 선택하십시오.

1
the_drow