2009-06-11 14 views

Respuesta

25

Exactamente lo mismo que struct campos no:

#include <stdio.h> 
int main (int c, char *v[]) { 
    struct _a { 
     int a1; 
     volatile int a2; 
     int a3; 
    } a; 
    a.a1 = 1; 
    a.a2 = 2; 
    a.a3 = 3; 
    return 0; 
} 

Se pueden marcar toda la struct tan volátil utilizando "volatile struct _a {...}" pero el método anterior es para los campos individuales.

9

debe ser bastante sencillo de acuerdo con el artículo this:

Por último, si se aplica volátil a una estructura o unión , todo el contenido de la estructura /unión son volátiles. Si no desea este comportamiento, puede aplicar el calificador volátil a los miembros individuales de la estructura/unión .

1

Solo una advertencia sobre la palabra clave volátil de C/C++.

A menos que sepa lo que está haciendo, nunca debería usarlo.

C/C++ volátil! = Java/C# volátil

volátil no ayuda en el código roscado menos que realmente sepa lo que está haciendo, es necesario utilizar C++ 0x plantilla atómica (o algo similar).

La única vez que he tenido que usar volátiles es cuando controlo registros de hardware.

+0

Creo que ha declarado que es un poco más fuerte de lo estrictamente necesario. volátil sí ayuda con el código enhebrado, especialmente en las plataformas integradas de núcleo único. Pero debes saber cómo usarlo. También es efectivamente obligatorio cuando se hace referencia a registros de hardware con o sin DMA, especialmente un registro que se sondeará para conocer el estado. También es necesario comprender su caché y cómo administrarla correctamente, y comprender cómo realizar operaciones atómicas en su plataforma. – RBerteig

+0

Tienes razón. No sabía que estaba pensando cuando dije DMA, me refería a MMIO. He editado la respuesta a algo mejor (espero). –

+0

Según wikipedia (http://en.wikipedia.org/wiki/Volatile_variable), C# parece tener el mismo comportamiento que C/C++, mientras que solo Java tiene una semántica diferente. –

0

Si los miembros declarados como volátiles no cambian debido al mantenimiento de alguna interrupción (es decir, un manejador de señal u otra variable atómica cercana), probablemente no se debe usar volátil (ya que la mayoría de los compiladores lo optimizarán si no lo suficientemente cerca).

De lo contrario, como han dicho otros .. sólo lo utilizan a continuación, examinar el asm volcados para ver si su compilador de hecho está de acuerdo con usted :)

En algunos casos, es decir, ciertas versiones de gcc .. su pena comprobar los deshecho.

Cuestiones relacionadas