Post by Jens LengePost by Hans-Peter DiettrichPost by Jens LengeARC = Statisches und deterministisches Freigeben, Zeitpunkte stehen
zur compilezeit weitgehend fest
Das stimmt so nicht. Wann die letzte Referenz auf ein Objekt
verschwindet, hängt vom Ablauf des Programms ab, genau wie bei jeder
anderen GC Methode.
Es ist in vielen Fällen (insbesondere bei lokalen Objekten mit genau
einer Referenz) bereits zur Compilezeit exakt bekannt und kann von
halbwegs optimierenden Compilern diret mit einkompiliert werden.
IMO überschätzst Du da, was ein Compiler mit erträglichem
Laufzeitaufwand sicher ermitteln kann. Was wenn eine Methode des Objekts
z.B. die Referenz in eine Liste einträgt?
Aus diesem Grund werden ja sogar anonyme Prozeduren als Methoden einer
(ebenfalls anonymen) Klasse implementiert, die dann (notfalls als
Interface) mit ARC verwaltet wird.
Bei C++ ist das Zerstören lokaler Instanzen der Standard, dafür braucht
man kein ARC, sondern eher ein "static" Attribut, das die Speicherklasse
(stack) und damit die Lebensdauer solcher Objekte bestimmt. Damit
könnten Programme sogar schneller werden, wenn beim Erzeugen und Löschen
von Objekten nicht jedesmal der Speichermanager (heap) bemüht werden
muß. In solchen Fällen habe ich desöfteren schon Object statt Class
benutzt, heute kämen dafür Records (mit Methoden) in Frage, die der
Entwickler wahlweise in den Stack oder Heap legen kann.
Post by Jens LengeDass
das nicht alle Fälle abdeckt ist klar, manches geht natürlich erst zur
Laufzeit.
Wo siehst Du überhaupt ein Problem, wenn in Deinem Beispiel am Ende des
Unterprogramms noch eine Überprüfung der Referenzen durchgeführt wird,
bevor das Objekt tatsächlich gelöscht wird? Das befreit den Compiler von
einer detaillierten und möglicherweise fehlerhaften Analyse, und hat
keinen spürbaren Einfluß auf Speicherbedarf und Laufzeit.
Post by Jens LengePost by Hans-Peter DiettrichDann hoffe ich für uns beide, daß ARC zumindest abschaltbar wird!
Hmmm... mir fällt auf Anhieb (außer evtl. Kompatibilität mit Altcode?)
kein Szenarios ein, in dem man das wollen würde.
Alte Gewohnheiten lassen sich nicht so einfach ändern, und die
Verwendung von automatischer Speicherverwaltung befreit den Entwickler
keineswegs vom Mitdenken - er muß sich nur *andere* Gedanken über seine
Objekte machen, und ggf. das gewohne Free() durch Finalize() ersetzen.
DoDi