AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ARC abgeschafft?

Ein Thema von stahli · begonnen am 29. Mai 2020 · letzter Beitrag vom 2. Jun 2020
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.530 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Warum ARC abgeschafft?

  Alt 31. Mai 2020, 11:59
Nun auch mal meinen Senf zum Thema ARC.

Ich konnte mich noch nie mit ARC anfreunden. Wenn ich etwas erzeuge, dann möchte ich auch selber entscheiden, wann es freigegeben wird. Bin vielleicht darin etwas altmodisch.

Lästig ist allerdings der ganze try-finally-Block innerhalb einer Procedure.

Aber dafür hat man mit Managed Records ja nun eine Art ARC-Lite. Einfach eine TStringlist in ein Managed Record (TMyStringlistRec) reinschmeissen. Der Record übernimmt das Erzeugen und Freigeben der Stringlist. Nun muss nur noch in einer Procedure statt einer TStringlist der Record (TMyStringlistRec) deklariert werden und ich kann auf die Stringlist zugreifen. Um das Create und Free muss ich mich nicht mehr kümmern. Try-Finally fällt weg.

(Soviel zur Theorie. In der Praxis habe ich das noch nicht getestet.)
Wir hatten das ja beim letzten Delphi-Frühstück im Ansatz mal getestet. Ich habe das mit den Managed records inzwischen umgesetzt und kann Dir sagen, das funktioniert hervorragend. Habe mir bezogen auf Stringlists direkt 3 unterschiedliche Record-Typen angelegt :

TMyStringList // ganz normal
TMySortedStringList // StringList mit Sortierung
TMyStrictSortedStringList // sortiert und mit dupignore (also keine doppelten Einträge)


Wenn ich also in einer Prozedur eine einfache Stringlist brauche, geht das einfach so:

Delphi-Quellcode:
Procedure TuWasMitDatei (AFile: String);
begin
 
  if FileExists (AFile) then begin // Wenn Datei nicht existiert wird Liste nicht gebraucht, Inline Var macht hier sinn

    var sl: TMyStringList;
    sl.List.LoadFromFile (AFile);

    /// weitere aktionen

  end;
 
end;
Durch die Intialisierungsblöcke im Record wird die StringList automatisch erzeugt (und falls erforderlich wie gewünscht vorbelegt)
Nach Austritt aus der Procedur wird die Finalization im Record aufgerufen und die Liste freigegeben

--> Kein Try Finally mehr für solche Sachen in der eigenen Prozedur notwendig (in der Implementation
des Records auch nicht, das macht der Compiler automatisch)
--> Bei einer streng sortierten Liste erspare ich mir noch das Setzen von "sorted" und "dupIgnore"
--> Ein weiteres Feature, das ich liebe.

Geändert von Harry Stahl (31. Mai 2020 um 12:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#12

AW: Warum ARC abgeschafft?

  Alt 31. Mai 2020, 13:23
Ich konnte mich noch nie mit ARC anfreunden. Wenn ich etwas erzeuge, dann möchte ich auch selber entscheiden, wann es freigegeben wird. Bin vielleicht darin etwas altmodisch.
So rein aus Interesse: Was für Fehler/Probleme versuchst du da zu vermeiden?

Ich frage, weil der allergrößte Teil von Fehlern (abgesehen von Semantik) in Software use-after-free sein dürfte. Und auch in der Arbeit haben wir ein ähnliches Problem des Kalibers "Wenn jeder einfach immer aufpassen und es richtig machen würde, hätten wir das Problem ja gar nicht. Wir müssen mehr aufpassen!"

Meine persönliche Meinung dazu ist, dass das keine zuverlässige Lösung ist. Entweder braucht man eine Sprache / ein Framework oder eine Coding-Konvention in der das nicht passiert (sprich: man kommt nicht auf die Idee sowas zu tun weil es überall schon anders gemacht wird) oder man lebt mit den Problemen.

Beispiel Angular / rxjs: Man muss ständig subscriben, um Callbacks zu registrieren. Man muss aber auch unsubscriben, sonst hat man ein memory leak. Wenn jeder im Team immer dran denkt: Alles super.
Wir messen unsere memory leaks in KB/s - aktuell sind wir bei 300 KB/s.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#13

AW: Warum ARC abgeschafft?

  Alt 31. Mai 2020, 13:31
Wir messen unsere memory leaks in KB/s - aktuell sind wir bei 300 KB/s.
Zum Glück gibt es endlich 64 Bit,
sonst würde es nach 2 Wochen bissl eng.

Auch wenn wir schon zu lange auf 128 und 256 warten, aber Delphi ist ständig hinterher.


Kreuzreferenzen, verkettete Listen, multiple ParentOwner-Child-Verknubbelungen usw. .... endlich gibt es jetzt eine Möglichkeit das nun wieder ohne größere Umstände crossplatform hinzubekommen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Mai 2020 um 13:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#14

AW: Warum ARC abgeschafft?

  Alt 2. Jun 2020, 16:33
Beispiel Angular / rxjs: Man muss ständig subscriben, um Callbacks zu registrieren. Man muss aber auch unsubscriben, sonst hat man ein memory leak. Wenn jeder im Team immer dran denkt: Alles super.
Das würd ich aber eher als Fehler im Design bzw der Implementierung in rxjs bezeichnen - in Reactive.net musste auch nix unsubscriben, jede subscription isn disposable und die fliegen am Ende der Anwendung weg - klar die subscription ist so lange aktiv, aber das will man ja ggf. Ansonsten merkt man sich das Ergebnis von Subscribe und disposed es wenn die subscription weg soll.


RX ist aber ein gutes Beispiel, was in Delphi (abgesehen von der fast unmöglich implementierbaren generischen API) für ziemliches Kopfzerbrechen sorgt: die Speicherverwaltung für Objekte, die durch so ein Observable wandern. Da das asynchron, parallel und sonst läuft, je nachdem welche Operationen man auf son ein Observable anwendet, ist es einfach nicht möglich das händische manuelle Freigeben zu praktizieren sondern muss mit einem selbst implementierten Mechanismus (über smartpointer oder anders referenzgezählte Objekte) dafür sorgen - das fluppt einfach überall wo GC werkelt wunderbar (jaja, GC hat sein eigenes Päckchen an "tu das halt nicht", aber das haben wir schon an anderer Stelle ad nauseam diskutiert)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz