Drehen Sie Ihre Frage um. Die eigentliche motivierende Frage ist, unter welchen Umständen wir die Kosten für die Müllabfuhr vermeiden können.
Nun, zunächst einmal, was sind die Kosten für die Garbage Collection? Es gibt zwei Hauptkosten. Zunächst müssen Sie feststellen, was noch lebt . das erfordert möglicherweise viel arbeit. Zweitens müssen Sie die Löcher komprimieren , die entstehen, wenn Sie etwas freigeben, das zwischen zwei noch lebenden Dingen aufgeteilt wurde. Diese Löcher sind verschwenderisch. Sie zu verdichten ist aber auch teuer.
Wie können wir diese Kosten vermeiden?
Wenn Sie ein Speichernutzungsmuster finden, bei dem Sie niemals etwas Langlebiges zuweisen, dann etwas Kurzlebiges zuweisen und dann etwas Langlebiges zuweisen, können Sie die Kosten von Löchern eliminieren. Wenn Sie sicherstellen können, dass für eine Teilmenge Ihres Speichers jede nachfolgende Zuordnung kürzer als die vorherige Zuordnung in diesem Speicher ist, werden in diesem Speicher keine Lücken mehr vorhanden sein.
Aber wenn wir das Lochproblem gelöst haben, haben wir auch das Garbage Collection-Problem gelöst . Haben Sie etwas in diesem Speicher, das noch lebt? Ja. Wurde alles zugeteilt, bevor es länger lebte? Ja - diese Annahme ist, wie wir die Möglichkeit von Löchern beseitigt haben. Sie müssen also nur sagen: "Ist die letzte Zuweisung noch aktiv?" und Sie wissen, dass in diesem Speicher alles lebendig ist.
Haben wir eine Reihe von Speicherzuordnungen, bei denen wir wissen, dass jede nachfolgende Zuordnung von kurzer Dauer ist als die vorherige Zuordnung? Ja! Aktivierungsframes von Methoden werden immer in der entgegengesetzten Reihenfolge zerstört, in der sie erstellt wurden, da sie immer kürzer sind als die Aktivierung, die sie erstellt hat.
Daher können wir Aktivierungsrahmen auf dem Stapel speichern und wissen, dass sie niemals gesammelt werden müssen. Befindet sich ein Frame auf dem Stapel, ist der gesamte Satz von Frames darunter länger haltbar, sodass sie nicht gesammelt werden müssen. Und sie werden in der entgegengesetzten Reihenfolge zerstört, in der sie erschaffen wurden. Die Kosten für die Speicherbereinigung entfallen somit für Aktivierungsrahmen.
Deshalb haben wir in erster Linie den temporären Pool auf dem Stack: weil dies eine einfache Möglichkeit ist, die Methodenaktivierung zu implementieren, ohne dass ein Speicher-Management-Aufwand entsteht.
(Natürlich sind die Kosten für das Sammeln des Speichers , auf den in den Aktivierungsrahmen verwiesen wird, immer noch da.)
Stellen Sie sich nun ein Kontrollflusssystem vor, bei dem Aktivierungsrahmen nicht in einer vorhersehbaren Reihenfolge zerstört werden. Was passiert, wenn eine kurzlebige Aktivierung zu einer langlebigen Aktivierung führen kann? Wie Sie sich vorstellen können, können Sie in dieser Welt den Stapel nicht mehr verwenden, um die Notwendigkeit zu optimieren, Aktivierungen zu sammeln. Der Aktivierungssatz kann wieder Löcher enthalten.
C # 2.0 hat diese Funktion in Form von yield return
. Eine Methode, die eine Rendite erzielt, wird zu einem späteren Zeitpunkt - wenn MoveNext das nächste Mal aufgerufen wird - wieder aktiviert. Wann dies geschieht, ist nicht vorhersehbar. Daher werden die Informationen, die sich normalerweise auf dem Stapel für den Aktivierungsrahmen des Iteratorblocks befinden, stattdessen auf dem Heap gespeichert, wo sie beim Sammeln des Enumerators als Müll gesammelt werden.
In ähnlicher Weise können Sie mit der Funktion "Async / Warten", die in den nächsten Versionen von C # und VB verfügbar ist, Methoden erstellen, deren Aktivierungen an genau definierten Punkten während der Aktion der Methode "nachgeben" und "wieder aufnehmen". Da die Aktivierungsframes nicht mehr auf vorhersehbare Weise erstellt und zerstört werden, müssen alle Informationen, die zuvor im Stapel gespeichert waren, im Heap gespeichert werden.
Es ist nur ein Zufall der Geschichte, dass wir für einige Jahrzehnte entschieden haben, dass Sprachen mit Aktivierungsrahmen, die streng geordnet erstellt und zerstört werden, in Mode sind. Da modernen Sprachen diese Eigenschaft zunehmend fehlt, erwarten Sie immer mehr Sprachen, die Fortsetzungen auf dem mit Müll gesammelten Haufen statt auf dem Stapel wiedergeben.