Odśmiecacz Boehm
Inne nazwy | bdwgc |
---|---|
Oryginalni autorzy | Hansa-Juergena Boehma |
Deweloperzy | Iwan Majdański i in. |
Pierwsze wydanie | 1988 |
Wersja stabilna | 8.0.6 / 28 września 2021
|
Wersja podglądu | 8.2.0 / 29 września 2021
|
Magazyn | |
Napisane w | C |
Typ | Śmieciarz |
Licencja | podobny do X11 ( wolne oprogramowanie ) |
Strona internetowa |
|
Moduł wyrzucania elementów bezużytecznych Boehm-Demers-Weiser , często znany po prostu jako Boehm GC , jest konserwatywnym modułem wyrzucania elementów bezużytecznych dla C i C++ opracowanym przez Hansa Boehma, Alana Demersa i Marka Weisera .
Boehm GC jest wolnym oprogramowaniem rozpowszechnianym na podstawie liberalnej licencji wolnego oprogramowania, podobnej do licencji X11 . Pierwsza praca przedstawiająca tego kolekcjonera ukazała się w 1992 roku.
Projekt
Hans Boehm tak opisuje działanie kolektora:
Kolektor wykorzystuje algorytm mark-sweep. Zapewnia gromadzenie przyrostowe i generacyjne w systemach operacyjnych, które zapewniają odpowiedni rodzaj obsługi pamięci wirtualnej. (Obecnie obejmuje to SunOS[45], IRIX, OSF/1, Linux i Windows, z różnymi ograniczeniami.) Pozwala na wywołanie kodu finalizacji, gdy obiekt jest zbierany. Może skorzystać z informacji o typie, aby zlokalizować wskaźniki, jeśli takie informacje są dostarczone, ale zwykle jest używany bez takich informacji.
Boehm GC może również działać w trybie wykrywania nieszczelności , w którym zarządzanie pamięcią jest nadal wykonywane ręcznie, ale Boehm GC może sprawdzić, czy jest to zrobione poprawnie. W ten sposób programista może znaleźć wycieki pamięci i podwójne zwolnienia.
Boehm GC jest również dystrybuowany z biblioteką obsługi łańcuchów C zwaną cords. Jest to podobne do ropes w C++ ( drzewa stałych małych tablic), ale zamiast używać liczenia referencji do prawidłowego zwolnienia, polega na wyrzucaniu elementów bezużytecznych do wolnych obiektów. Cordy dobrze radzą sobie z bardzo dużymi tekstami, modyfikacjami ich w środku, krojeniem, łączeniem i przechowywaniem historii zmian ( cofania /ponawiania).
Operacja
Garbage collector działa z większością niezmodyfikowanych programów C, po prostu zastępując malloc() wywołaniami GC_MALLOC() , zastępując realloc() wywołaniami GC_REALLOC() i usuwając wywołania free() . Poniższy fragment kodu pokazuje, jak można używać Boehm zamiast tradycyjnego malloc i za darmo w C.
0
0
0
#include <assert.h> #include <stdio.h> #include <gc.h> int main ( void ) { int i ; const int size = 10000000 ; GC_INIT (); for ( ja = ; i < rozmiar ; ++ ja ) { int ** p = GC_MALLOC ( rozmiar * p ); int * q = GC_MALLOC_ATOMIC ( rozmiar * q ); potwierdzić ( * p == ); * p = GC_REALLOC ( q , 2 * sizeof * p ); if ( i == size -1 ) printf ( "Rozmiar sterty = %zu \n " , GC_get_heap_size ()); } powrót ; }
Dla kompletności Boehm obsługuje jawne zwalnianie za pomocą GC_FREE() . Wszystkie podstawienia można wykonać za pomocą makr preprocesora.
Zastosowania i porty
Boehm GC jest używany w wielu projektach zaimplementowanych w C lub C++, takich jak Inkscape , a także w środowiskach wykonawczych dla wielu innych języków, w tym Crystal , wysokowydajny kompilator Pythona Codon, GNU Compiler dla środowiska wykonawczego Java, Projekt Portable.NET , Embeddable Common Lisp , GNU Guile , implementacja Mono platformy Microsoft .NET (również wykorzystująca precyzyjne kompaktowanie GC od wersji 2.8), opcjonalnie GNUstep i libgc-d (powiązanie z libgc dla języka programowania D , używany głównie w MCI). Obsługuje wiele systemów operacyjnych , w tym wiele wariantów systemu Unix (takich jak macOS ) i Microsoft Windows , i zapewnia szereg zaawansowanych funkcji, w tym gromadzenie przyrostowe, gromadzenie równoległe i różnorodne semantyki finalizatora .
Linki zewnętrzne
- Oficjalna strona internetowa
- Moduł wyrzucania elementów bezużytecznych Boehm na SourceForge
- Repozytorium Git dla rozwoju BoehmGC na GitHub
- Przejrzyste zbieranie śmieci kierowane przez programistów dla C++, Hans-J. Boehma i Michaela Spertusa
- Dr Dobbs The Boehm Collector for C and C++, Gene Michael Stover, 01 marca 2003