Wenn alles eine Schnittstelle implementiert wäre, wäre dies eine Garbage Collection?

7

Ich bin immer noch ein Neuling, und ich weiß, dass mein Denken falsch ist; Ich weiß einfach nicht wo ...

Fast alles in Delphi stammt von TObject ab. Was, wenn alles stattdessen von einem TInterfaceObject abstammt, das eine triviale Schnittstelle implementiert hat (z. B. "INamable", mit einer einzigen Methode, die die Namenszeichenfolge einer Klasse zurückgegeben hat)? Da TObject bereits über eine Eigenschaft verfügt, die eine Namenszeichenfolge zurückgibt, müssen Sie keinen zusätzlichen Klassen hinzufügen.

Mit anderen Worten würde ein TInterfacedObject von TObject (oder etwas, das in der Hierarchie ganz oben liegt) erben, und alles, was gerade von TObject abstammt, würde nun von dieser neuen Klasse abstammen. Würde das nicht bedeuten, dass jetzt alles gezählt wurde?

Wenn Sie herausfinden, wo mein Wissen fehlt, würde ich gerne lernen. Danke, wie immer - Al C.

    
Al C 17.09.2009, 00:29
quelle

5 Antworten

8

Es ist nicht klar, ob Sie fragen:

  • Warum hat Borland das nicht gemacht, als sie ursprünglich Delphi entwickelt haben?
  • Warum macht Embarcadero das nicht in einer zukünftigen Version von Delphi?
  • Warum mache ich das nicht mit meinen eigenen Benutzerdatentypen?
  

Würde das nicht bedeuten, dass jetzt alles gezählt wurde?

Ja, würde es.

Sie möchten jedoch nicht unbedingt, dass alles gezählt wird: jede kleine ganze Zahl, jeder String, jeder boolesche Wert, jedes Element in einem Array ... wenn schon aus anderen Gründen Die Implementierung der Ref-Zählung fügt einen zusätzlichen Aufwand hinzu, z ein wenig mehr Speicher pro Objekt, vielleicht unbedeutend für große Objekte, aber proportional signifikanter, wenn es auf jedes winzige Objekt angewendet wird.

Siehe auch Garbage Collector für Delphi-Objekte und -Komponenten , in dem (Zitat),

steht

Delphi bietet drei Möglichkeiten der Objektverwaltung:

  
  1. Erzeuge / zerstöre die Objekte mit try..finally.
  2.   
  3. Verwenden Sie TComponent-Nachkommen - erstellen Sie eine Komponente und lassen Sie sie vom Eigentümer freigeben.
  4.   
  5. Interfaces - Wenn der Referenzzähler für eine Schnittstelle 0 wird, wird der   Objekt, das es implementiert ist   zerstört.
  6.   

Die Delphi-Hilfe sagt, Sie sollten nicht mischen   der TComponent Owner Ansatz mit dem   Schnittstellenspeicherverwaltung, aber ...

     

Wäre das eine Garbage Collection?

Nicht ganz; bloße Referenzzählung ist nicht so robust wie Müllsammlung:

  • Wenn Sie bei der Referenzzählung zwei referenzierte Instanzen haben, die jeweils einen Verweis auf die andere enthalten, werden sie nicht automatisch freigegeben. Um sie freizugeben, müßten Sie diesen 'Zirkelverweis' brechen (d. H. Explizit einem von ihnen mitteilen, seinen Verweis auf den anderen freizugeben).

  • Bei einer echten Garbage-Collection würde der Garbage-Collector bemerken, dass diese beiden Bereiche von keiner anderen Stelle aus referenziert werden und beide freigeben.

Aktualisieren
Wenn Sie Ihre potenziellen Zirkelverweise als [weak] -Referenzen annotieren, werden sie in Ordnung zerstört. Aber vor Delphi 10.1 Berlin funktioniert das nur in den NexGen-Compilern (d. H. Denen, die LLVM unter der Haube verwenden). Ab 10.1 Berlin funktionieren diese [weak] Referenzen überall.

    
ChrisW 17.09.2009, 01:30
quelle
5

Es würde keine Garbage-Collection funktionieren, da Interfaces ein sehr einfaches System zum Zählen von Referenzen verwenden und zirkuläre Referenzen, die in Delphi-Code sehr häufig vorkommen, brechen das einfache Ref-Zählen.

    
Mason Wheeler 17.09.2009 00:40
quelle
3

Nein, wegen zweier Dinge:

  1. Selbst wenn eine Klasse eine Schnittstelle implementiert, wird sie nicht automatisch gezählt. Nur wenn Sie es tatsächlich zur Implementierung dieser Schnittstelle verwenden, hat die Referenzzählung einen Effekt.
  2. Wie bereits erwähnt, führt die Referenzzählung in Schnittstellen dazu, dass die Klasseninstanz sofort freigegeben wird, wenn die Referenzzahl 0 erreicht. Dies ist ein impliziter Aufruf der Free-Methode an diesem Punkt im Code. Dies wird z.B. wenn zwei Objekte aufeinander verweisen. Bei einer echten Garbage-Collection werden die Objekte nicht freigegeben, wenn sie den Gültigkeitsbereich verlassen, aber wenn Speicher benötigt wird. Daher gibt es keine Leistungsbeeinträchtigung, wenn der Referenzzähler 0 erreicht, weil das Objekt einfach weiter besteht. Außerdem erkennt ein guter Garbage Collector die isolierten Zirkelverweise (z. B. A Verweise B verweist C Verweise A, aber nichts anderes verweist auf diese Objekte) und wird diese Objekte ebenfalls freigeben.
dummzeuch 17.09.2009 14:59
quelle
2

Die Müllsammlung unterscheidet sich von der einfachen Ref-Zählung. Sie können eine automatische Löschung durchführen, wenn eine ref-Zählung 0 erreicht. Dies ist jedoch keine Garbage Collection. Garbage Collection bedeutet, dass Sie die Kontrolle über die Löschung von Daten aus dem Speicher verlieren und die Implementierung der zugrunde liegenden Sprache die Behaviours optimieren können. Sie hören auf, auf die Anzahl der Referenzen zu achten, und vertrauen auf das dynamische Verhalten einer bestimmten Implementierung der Garbage Collection.

Natürlich verwendet die Garbage Collection ein Referenzzählsystem, um zu wissen, wann etwas nicht mehr referenziert wird, aber das ist ein kleiner Teil des Puzzles.

    
Kieveli 17.09.2009 01:39
quelle
1

Referenzzählung ist eine Form der Speicherbereinigung, aber keine sehr gute. Es wird von einigen Sprachen verwendet (Python denke ich), obwohl oft mit Zykluserkennung.

Selbst wenn Sie von TInterfaceObject abstammen, wird das Objekt nicht gezählt, und daher wird Garbage gesammelt, es sei denn, Sie verwenden nur die Schnittstellenreferenz und nicht die Objektreferenz.

i.e. Sie müssten

verwenden %Vor%

Dies bedeutet, dass Ihre Schnittstelle bereits die Methoden und Eigenschaften unterstützen muss, die Sie benötigen, was schnell langweilig wird, da Sie für jede Klasse eine Schnittstelle erstellen müssen.

Es kann jedoch relativ einfach in D2009 oder später gemacht werden. Siehe Barry Kellys Einsatz von intelligenten Zeigern . Die üblichen Reference Countng Cities gelten jedoch.

    
SeanX 17.09.2009 03:13
quelle

Tags und Links