2008-10-24 11 views
10

En C y C++ una variable se puede marcar como volatile, lo que significa que el compilador no lo optimizará porque puede modificarse externamente al objeto declarante. ¿Hay un equivalente en la programación Delphi? Si no es una palabra clave, ¿tal vez una solución alternativa?¿Tiene Delphi algún equivalente a la variable volátil de C?

Mi idea era usar Absoluto, pero no estaba seguro, y eso puede presentar otros efectos secundarios.

+0

Absolute introduce un alias, un nombre diferente (y posiblemente un tipo) para la misma ubicación. –

+0

Si puedo preguntar, ¿por qué es necesario? Tal vez hay otra forma de hacer lo que necesita. – Bernard

+0

Un compañero de trabajo era simplemente curioso. Le pregunté lo mismo (por qué). Le dije lo que pensaba, pero sabía cómo averiguarlo. –

Respuesta

13

Respuesta corta: no.

Sin embargo, no estoy al tanto de cualquier situación en la que el enfoque conservador del compilador cambiará el número de lecturas o escrituras si se sigue este enfoque:

Al leer un lugar visible entre subprocesos, guardar su valor a un local antes de hacer cualquier otra manipulación; de forma similar, restringe las escrituras a una sola tarea.

El compilador Delphi no realiza la eliminación de subexpresiones comunes (CSE) en expresiones de ubicación no locales cuando hay llamadas a métodos no alineados entre las expresiones, ya que el compilador no hace optimización interprocedural y por lo tanto no sería correcto incluso para código de subproceso único.

Por lo tanto, es posible que desee utilizar InterlockedExchange() para hacer sus lecturas y escrituras para forzar esto; Además, esto causará una barrera de memoria completa, por lo que el procesador no reordenará las lecturas ni las escrituras.

1

No conozco ningún equivalente, ni creo que la directiva absoluta te ayude. absolute le permite tener dos variables que usan la misma dirección, pero no creo que impida que el compilador optimice las referencias a esa memoria.

Imagino que podría usar un puntero y administrarlo usted mismo. De esta forma, haga lo que haga el compilador en cuanto a la optimización de la recuperación del valor del puntero, no debe asumir que el valor almacenado en la dirección es el mismo que la última vez que lo leyó, pero esto es pura especulación.

0

¿Utiliza punteros asignados dinámicamente?

var 
    MyVarPtr: ^integer; 
begin 
    New(MyVarPtr); 
    MyVarPtr^ := 5; 
... 

Esto debe mantener el compilador del uso de un registro para el valor entero (pero todavía podría utilizar uno para la dirección). Sin embargo, no estoy seguro de cómo se compara con la volatilidad.

6

Según The Delphi Language for Mobile Development documento técnico, los compiladores móviles de Delphi han apoyado un atributo [volatile] desde que se introdujeron primero:

El atributo volatile se utiliza para marcar los campos que están sujetos a cambio por diferentes hilos, de modo que la generación de código no optimiza la copia del valor en un registro u otra ubicación de memoria temporal.

Usted puede utilizar el atributo volatile para marcar las siguientes declaraciones:

  • variables (globales y locales)
  • Parámetros
  • campos de un registro o de una clase.

No se puede utilizar el atributo volátil para marcar las siguientes declaraciones:

  • Tipo
  • procedimientos, funciones o métodos
  • Expresiones

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

Comenzando con Delphi 10.1 Berlin, los compiladores de escritorio también son compatibles con [volatile].

Attributes Supported by All Compilers

Ahora, todos los compiladores de Delphi apoyan los siguientes atributos:

Cuestiones relacionadas