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.

War es hilfreich?

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top