Hat Delphi jede äquivalent zu C flüchtigen Variable?
-
04-07-2019 - |
Frage
In C und C ++ eine Variable kann als markiert werden volatile , was bedeutet, wird der Compiler nicht optimieren, da es auf die Deklaration Objekt externen modifiziert werden kann. Gibt es ein Äquivalent in Delphi-Programmierung? Wenn kein Schlüsselwort, vielleicht eine Arbeit um?
Mein Gedanke war, verwenden Absolute , aber ich war nicht sicher, und das kann andere Nebenwirkungen vor.
Lösung
Kurze Antwort: no.
Allerdings bin ich von jeder Situation nicht bewusst, in dem der konservativen Ansatz des Compilers wird die Nummer ändern von liest oder schreibt, wenn Sie diesen Ansatz folgen:
Wenn Sie eine Cross-Thread sichtbaren Stelle zu lesen, um seinen Wert zu einem lokalen speichern, bevor sie eine weitere Manipulation zu tun; In ähnlicher Weise beschränken schreibt auf eine einzige Zuordnung.
Der Delphi-Compiler führt keine gemeinsame subexpression Elimination (CSE) auf nicht-lokalen Standort Ausdrücke, wenn es Anrufe an Nicht-inlined Methoden zwischen den Ausdrücken, wie der Compiler nicht interprozedurales Optimierung macht und somit wäre es nicht korrekt sein auch für Single-threaded-Code.
So können Sie InterlockedExchange () benutzen, um Ihre liest zu tun und schreibt dies zu zwingen; zusätzlich wird dies eine volle Speicher Barriere verursachen, so wird der Prozessor nicht neu anordnen liest und schreibt auch nicht.
Andere Tipps
Nach Die Delphi-Sprache für Mobile Development White Paper, Delphi mobilen Compiler haben eine [volatile]
Attribut, da sie zuerst eingeführt wurden:
Das
volatile
Attribut wird verwendet, um Felder zu markieren, die von verschiedenen Threads Änderungen unterliegen, so dass die Codegenerierung nicht optimiert nicht in einem Register oder einen anderen temporären Speicherplatz den Wert zu kopieren.Sie können die
volatile
Attribut verwenden Sie die folgenden Erklärungen markieren:
- Variablen (global und lokal)
- Parameter
- Felder eines Datensatzes oder einer Klasse.
Sie können nicht das flüchtige Attribut verwenden Sie die folgenden Erklärungen markieren:
- Typ
- Prozeduren, Funktionen oder Methoden
- Ausdrücke
type TMyClass = class private [volatile] FMyVariable: TMyType; end;
Beginnend mit Delphi 10.1 Berlin, jetzt den Desktop-Compiler [volatile]
auch stützen.
Attribute von allen Compilern unterstützt
Jetzt sind alle Delphi-Compiler unterstützt die folgenden Attribute:
Ich weiß nicht, von einem gleichwertigen, noch glaube ich, dass die absolute Richtlinie werden Ihnen helfen. absolute können Sie zwei Variablen haben, der die gleiche Adresse verwenden, aber ich glaube nicht, dass es den Compiler von der Optimierung Verweise auf diesen Speicher verhindern.
Ich stelle mir Sie einen Zeiger verwenden könnte und diese selbst verwalten. Auf diese Weise, was der Compiler so weit geht wie retrival des Zeigerwertes zu optimieren, sollte den Wert nicht davon ausgehen, an der Adresse gespeichert ist die gleiche wie beim letzten Mal es es lesen, aber das ist reine Spekulation.
Delphi für .NET hat nicht das Schlüsselwort auch nicht, aber die .NET-Plattform hat util Funktionen dafür. Siehe Thread.VolatileRead und Thread.VolatileWrite .
Verwenden dynamisch zugewiesenen Zeiger?
var
MyVarPtr: ^integer;
begin
New(MyVarPtr);
MyVarPtr^ := 5;
...
Dies sollte den Compiler ein Register für den Integer-Wert verwenden (aber immer noch einen für die Adresse verwenden könnte). Ich bin nicht sicher, wie das zu flüchtig vergleicht, though.