2008-10-24 9 views
10

In C und C++ kann eine Variable als volatile markiert werden, was bedeutet, dass der Compiler sie nicht optimiert, weil sie extern zum deklarierenden Objekt geändert werden kann. Gibt es ein Äquivalent in der Delphi-Programmierung? Wenn nicht ein Schlüsselwort, vielleicht eine Arbeit?Hat Delphi eine Entsprechung zur flüchtigen Variablen von C?

Mein Gedanke war, Absolute zu verwenden, aber ich war mir nicht sicher, und das kann andere Nebenwirkungen einführen.

+0

Absolute führt einen Alias ​​ein, einen anderen Namen (und möglicherweise Typ) für den gleichen Ort. –

+0

Wenn ich fragen darf, warum wird das gebraucht? Vielleicht gibt es einen anderen Weg zu tun, was Sie brauchen. – Bernard

+0

Ein Mitarbeiter war nur neugierig. Ich habe ihn dasselbe gefragt (warum). Ich sagte ihm, was ich dachte, aber dass ich wusste, wie ich es herausfinden sollte. –

Antwort

13

Kurze Antwort: Nein.

Ich bin jedoch nicht bekannt, dass Situation, in der der konservativen Ansatz des Compilers wird die Nummer ändern von liest oder schreibt, wenn Sie diesen Ansatz folgen:

Wenn ein verkanten sichtbare Stelle zu lesen, speichern ihre Wert für einen Local, bevor weitere Manipulationen vorgenommen werden; In ähnlicher Weise beschränken Sie Schreibvorgänge auf eine einzelne Zuweisung.

Der Delphi-Compiler führt keine allgemeine Teilausdruck-Eliminierung (CSE) für nichtlokale Ortsausdrücke durch, wenn Aufrufe zwischen den Ausdrücken auf Nicht-Inlined-Methoden erfolgen, da der Compiler keine prozedurale Optimierung durchführt Korrigieren Sie sogar für single-threaded Code.

Sie möchten also InterlockedExchange() verwenden, um Ihre Lese- und Schreibvorgänge zu erzwingen; Darüber hinaus führt dies zu einer vollständigen Speicherbarriere, sodass der Prozessor die Lese- und Schreibvorgänge nicht neu anordnet.

1

Ich kenne keine Entsprechung, noch glaube ich, dass die absolute Direktive helfen wird. absolute können Sie zwei Variablen haben, die die gleiche Adresse verwenden, aber ich glaube nicht, dass es den Compiler daran hindert, Verweise auf diesen Speicher zu optimieren.

Ich kann mir vorstellen, Sie könnten einen Zeiger verwenden und es selbst verwalten. Auf diese Weise, was auch immer der Compiler macht, was die Optimierung der Wiedererkennung des Pointer-Wertes betrifft, sollte er nicht annehmen, dass der an der Adresse gespeicherte Wert der gleiche wie beim letzten Lesen ist, aber das ist reine Spekulation.

0

Verwenden Sie dynamisch zugewiesene 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 mir nicht sicher, wie das mit volatilen verglichen wird.

6

Nach The Delphi Language for Mobile Development White Paper, Delphi mobilen Compiler haben eine [volatile] Attribut unterstützt, da sie zuerst eingeführt wurden:

Das volatile Attribut verwendet wird, Felder zu markieren, die von verschiedenen Threads Änderungen unterliegen, so dass die Code-Generierung optimiert nicht das Kopieren des Werts in einem Register oder einem anderen temporären Speicherort.

Sie können das volatile Attribut folgende Erklärungen markieren:

  • Variablen (global und lokal)
  • Parameter
  • Felder eines Datensatzes oder einer Klasse.

Sie können nicht die flüchtigen Attribut verwenden Sie die folgenden Erklärungen markieren:

  • Typ
  • Prozeduren, Funktionen oder Methoden
  • Expressions

type 
    TMyClass = class 
    private 
    [volatile] FMyVariable: TMyType; 
    end; 

Beginnend mit Delphi 10.1 Berlin, unterstützen die Desktop-Compiler jetzt auch [volatile].

Attributes Supported by All Compilers

nun alle Delphi-Compiler unterstützt die folgenden Attribute: