Garbage Collector
-
Was für GCs könnt ihr nach eurer Erfahrung für C++ empfehlen? Die, die ich bis jetzt gefunden habe, überladen den operator new, ist das schon die übliche Praxis, oder?
Wie schaut es da so mit der Performance aus?
-
-
All classes derive from RTGC::Void
Also wird new int nicht collected?
-
Der Klassiker ist natürlich http://www.hpl.hp.com/personal/Hans_Boehm/gc/index.html
-
-
Artchi schrieb:
http://www.kharchi.de/cppratgeber.htm#resourcenfreigabe_autopointer
vector<int> zahlen(10); // vector vom Typ int mit 10 Elementen anlegen. zahlen[12] = 13; // versuchen in 12. Feld den Wert 13 ablegen. // Würde zur Laufzeit nicht ausgeführt werden, denn vector macht vorher eine Überprüfung, ob es überhaupt so viele Elemente gibt!
Falsch. Es wird keine Überprüfung gemacht und es entsteht undefiniertes Verhalten.
-
Optimizer schrieb:
All classes derive from RTGC::Void
Also wird new int nicht collected?
Alles können GCs in C++ prinzipbedingt nicht kontrollieren.
Nehmen wir nur mal sowas:
int* p = new int; *p = ...; ofstream out(...); out << p; p = 0; /* Es gibt keinen Zeiger, der auf den assozierten Bereich zeigt; GC kann das beweisen und räumt auf. */ ifstream in(...); in >> p; /* Autsch */ if (*p == ...) ...;
-
Ja gut, das hat aber jetzt nichts mit der Problematik zu tun, dass primitive Datentypen nicht collected werden, oder verstehe ich dich falsch? IMHO sollte das ein GC aber schon beherrschen, genauso Sachen wie
new int;
ohne dass ich das erst an nen autopointer zuweisen muss.
Artchi schrieb:
http://www.kharchi.de/cppratgeber.htm#resourcenfreigabe_autopointer
Nene, autopointer sind nicht das, was mich interressiert.
*den "Klassiker" anschau*
-
Daniel E.: Sowas kann ja nichtmal ein konservativer GC wie der Boehm. Komisch eigentlich, weil Stroustrup ja nicht müde wird zu betonen, wie wichtig ihm Garbage Collection ist (nur halt nicht in der Sprache integriert.)
-
Ich verwende den Boehm-GC schon eine ganze Weile, hatte jedoch anfangs ein paar Probleme. Um normale Typen wie int, kann sich der gc nach Aufforderung auch drum kümmern. Man kann '::operator new' überladen, wovon ich nicht viel halte, oder eine überladene Variante nehmen:
int* pi = new (UseGC) int; // oder:
int* pi = new (PointerFreeGC) int;Dumm ist nur, dass dieses new eine '0' bei Speichermangel zurückgibt, also sollte man diese Funktionen neu definieren. Da es recht viele sind (über 50 meist triviale Inliner), kann ich dir meine Dateien mailen.
Grüße
Fux
-
Fux: Kannst du nicht den new_handler neu setzen? Auf eine Funktion, die bad_alloc wirft z.B. ...
-
Hmm, das würde vielleicht die Anzahl der Funktionen reduzieren, aber irgendwie hab ich da so meine Bedenken, weil normalerweise erst dann ein bad_alloc geworfen wird, wenn es keine weiteren new_handler mehr gibt. Außerdem nutzt das new vom boehm-gc erst garnicht den new_handler. Wie gesagt, man könnte vielleicht was drehen, aber ob dann alles richtig funktioniert, kann ich nicht sagen.
-
http://www.iecc.com/gclist/GC-faq.html
Falls es jemanden interressiert, ich finde es gerade recht interressant.