C++에 사용할 수있는 무료 및 상용 가비지 수집 라이브러리는 무엇이며 각각의 장단점은 무엇입니까?
마케팅이나 홍보 광고가 아닌 현장에서 실제로 사용하여 얻은 어려운 교훈에 관심이 있습니다.
자동 가비지 수집과 관련된 일반적인 트레이드 오프에 대해 자세히 설명 할 필요는 없지만 사용 된 알고리즘 (참조 카운팅, 마크 및 스윕, 증분 등)을 언급하고 그 결과를 간략하게 요약하십시오.
나는 과거에 Boehm 수집가 를 성공적으로 사용했습니다. 오픈 소스이며 상용 소프트웨어에서 사용할 수 있습니다.
그것은 보수적 인 수집가이며, 가비지 수집 기술의 가장 뛰어난 연구자 중 한 명이 개발 한 오랜 역사를 가지고 있습니다.
Boost는 스마트 포인터 의 광범위한 범위를 가지고 있으며 이는 참조 계산 또는 범위에서 삭제 종료 또는 침입 참조 계산을 의미합니다. 이것들은 우리의 필요에 충분히 입증되었습니다. 큰 장점은 모두 무료, 오픈 소스, 템플릿 기반 C++라는 것입니다. 참조 카운트이기 때문에 대부분의 경우 객체가 파괴 될 때 매우 결정적입니다.
나는 boehm-gc를 많이 사용합니다. 사용하기는 간단하지만 문서는 정말 열악합니다. C++ 페이지가 있지만 찾기가 매우 어렵습니다.
기본적으로 모든 클래스가 기본 클래스에서 상속되는지 확인하고 항상 gc_allocator를 컨테이너에 전달합니다. 많은 경우에 libgccpp를 사용하여 new 및 delete의 다른 용도를 포착하려고합니다. 이는 대체로 높은 수준의 변경 사항이며 컴파일 타임에 #ifdef를 사용하여 GC를 끌 수 있으며이를 지원하는 것은 하나 또는 두 개의 파일에만 영향을줍니다.
내 주요 문제는 수집기를 먼저 끄지 않으면 더 이상 Valgrind를 사용할 수 없다는 것입니다. 수집기를 끄는 것은 쉬운 일이고 재 컴파일 할 필요가 없지만 메모리가 부족해지기 시작하면 사용하는 것은 분명히 불가능합니다.
The Boehm 가비지 수집기 무료로 사용할 수 있으며, 다소 좋습니다 (직접 경험하지 않음).
([PDF WARNING] Boehm 가비지 수집기에 대한 C++ 0x 제안 )에 대한 이론적 문서
원래 C++ 0x 을 만들 것이라고 말했지만 결국 만들지는 않을 것입니다 (내가 생각하는 시간 제약으로 인해).
Proprosal N267 (가비지 컬렉터에 대한 최소한의 지원)은 2008 년 6 월에 승인을 받았으므로 컴파일러 구현이이 문제를 해결하고 표준이 완성되면 C++ 용 가비지 컬렉션 세계는 확실합니다. 변화...
C++에서 GC의 가장 큰 어려움은 GC 의미에서 비협조적인 모듈을 처리해야한다는 것입니다. 즉, GC를 염두에두고 작성되지 않은 라이브러리를 처리합니다.
이것이 Boehm GC가 종종 제안되는 이유입니다.
내가 아는 유일한 사람은 Boehm이며, 하단에는 전통적인 표시와 스윕이 있습니다. 이를 최적화하기 위해 다양한 기술을 사용할 수 있지만 일반적으로 증분/세대/압축 GC는 .Net C++로 얻을 수있는 것과 같은 관리되는 하위 집합을 사용하지 않고 C++ 용으로 만들기가 어렵습니다. 포인터를 이동하는 데 필요한 일부 접근 방식은 포인터 고정 또는 블록 읽기/쓰기에 대한 컴파일러 지원으로 구현할 수 있지만 성능에 대한 영향이 너무 클 수 있으며 반드시 GC에 대한 사소한 변경은 아닙니다.
똑같은 물건을 찾고있는 상업용 제품이 있습니다.
HnxGC http://hnxgc.harnixworld.com/
과거에는 Geodesic Systems의 Great Circle이라는 제품도 있었지만 더 이상 판매하지 않는 것 같습니다. 다른 사람에게 제품을 판매했는지 알 수 없습니다.
Microsoft의 Managed C++를 사용할 수도 있습니다. CLR 및 GC는 매우 견고하고 서버 제품에 사용되지만 GC가 실제로 수집하려면 CLR 유형을 사용해야합니다. 기존 코드를 다시 컴파일하고 모든 삭제 문을 제거 할 수는 없습니다.
저는 C #을 사용하여 새로운 코드를 작성하고 싶지만 Managed C++를 사용하면보다 점진적인 방식으로 코드 기반을 발전시킬 수 있습니다.
this 를 읽고 결론을 잘 살펴보십시오.
결론
- 간단한 솔루션이 널리 사용되는 문제에 대한 복잡한 솔루션이며 C++ 0x에 의해 개선 될 것이므로 거의 필요하지 않습니다.
- 표준화 할 권장 언어 기능에 대한 경험이 거의 없습니다.
- 나쁜 소프트웨어 복잡한 시스템을 고치는 것은 결코 작동하지 않습니다.
향후 GC 지원을 개선하기 위해 사소한 언어 변경을 권장합니다. 예를 들어 포인터 숨기기 (xor 목록 트릭)를 허용하지 않습니다.
마지막으로 "C++는 GC가 없기 때문에 나쁘다"라는 인수를 정면으로 처리합니다. C++는 쓰레기를 생성하지 않으므로 GC 가 필요하지 않습니다. 분명히 Java, C #, Objective C 등은 많은 쓰레기를 생성합니다.
네, 마지막 문장은 주관적이며 또한 거룩한 전쟁의 일부입니다.
C++을 사용하는 이유는 누군가 나를 위해 쓰레기를 버려야한다는 생각이 싫기 때문입니다.
시청에서 그렇게했고 그 정도면 충분합니다.
GC가 필요한 경우 다른 언어를 사용하세요. 올바른 작업에 적합한 도구를 선택하십시오.