Moment des letzten IUnknown.Release-Aufrufs

8

Ich habe zwei Varianten des gleichen Codes:

%Vor%

Ausgabe

%Vor%

Warum unterscheidet sich das Verhalten der beiden Varianten?

    
Denis Anisimov 29.06.2015, 06:10
quelle

1 Antwort

5

Testumgebung: Delphi XE7 Windows Compiler

In Variant1 entscheidet der Compiler, dass er eine implizite lokale Variable erstellen muss, um eine zusätzliche Schnittstellenreferenz zu speichern. Warum es so ist, kann ich nicht erkennen. Aber hier ist der ausgegebene Code um zu zeigen, dass dies passiert:

Variante1

%Vor%

Variante2

%Vor%

Implizite Locals werden am Ende der Funktion, in der sie deklariert sind, genau wie jede andere lokale Variable finalisiert. Aus diesem Grund wird Writeln('Variant1 end of proc') ausgeführt, und dann wird das implizite Local abgeschlossen, und dann wird die letzte Referenz auf das Objekt freigegeben.

Ein Faktor, der hier sehr interessant ist, ist, dass wenn Sie die Optimierung aktivieren, sich die Ausgabe zu:

ändert %Vor%

Aus irgendeinem Grund entscheidet der Compiler, kein implizites Local zu erstellen, wenn die Optimierung aktiviert ist.

Natürlich ist alles oben für den 32-Bit-Compiler. Der 64-Bit-Compiler ist wieder anders, würdest du es nicht wissen. Im 64-Bit-Compiler ist die Ausgabe wie bei der Frage unabhängig von der Optimierung.

Ich denke, dass dieses Thema vielleicht mit meiner Frage zusammenhängt Ist die Compiler-Behandlung von impliziten Schnittstellenvariablen dokumentiert? Nach meinem besten Wissen gibt es keine offizielle Spezifikation oder Dokumentation dessen, was der Compiler macht, und das Beste, was Sie hier tun können, ist empirisch zu lernen, indem Sie seine Ausgabe beobachten. Dass die Optimierung das Verhalten ändert, bedeutet, dass Sie versuchen sollten, Code zu vermeiden, der für solche Verhaltensänderungen anfällig ist. Wenn du es tatsächlich vorhersagen kannst.

    
David Heffernan 29.06.2015, 07:12
quelle

Tags und Links