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