2009-06-11 10 views

risposta

25

Esattamente come non struct campi:

#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; 
} 

è possibile contrassegnare l'intero struct come volatile utilizzando "volatile struct _a {...}", ma il metodo di cui sopra è per i singoli campi.

9

dovrebbe essere abbastanza semplice secondo il this articolo:

Infine, se si applica volatile per una struttura o unione, l'intero contenuto della struct/union sono volatili. Se non si desidera questo comportamento, è possibile applicare il qualificatore volatile ai membri singoli della struttura struct/union.

1

Solo un avvertimento sulla parola chiave volatile C/C++.

A meno che tu non sappia cosa stai facendo, non dovresti mai usarlo.

C/C++ volatili! = Java/C# volatili

volatili non aiuta nel codice threaded a meno che tu non sappia quello che stai facendo, è necessario utilizzare C++ 0x modello atomico (o qualcosa di simile).

L'unica volta che ho dovuto usare volatile è quando si controllano i registri hardware.

+0

Penso che tu abbia affermato che un po 'più forte di quanto sia strettamente necessario. volatile aiuta con il codice threaded, in particolare sulle piattaforme embedded single core. Ma devi sapere come usarlo. È anche efficace quando si fa riferimento ai registri hardware con o senza DMA, in particolare un registro che verrà interrogato per lo stato. È inoltre necessario comprendere la cache e come gestirla correttamente e capire come eseguire le operazioni atomiche sulla piattaforma. – RBerteig

+0

Hai ragione. Non sapevo che stavo pensando quando ho detto DMA, intendevo MMIO. Ho modificato la risposta a qualcosa di meglio (spero). –

+0

Secondo wikipedia (http://en.wikipedia.org/wiki/Volatile_variable), C# sembra avere lo stesso comportamento di C/C++, mentre solo Java ha una semantica diversa. –

0

Se i membri dichiarati come volatili non vengono modificati a causa della manutenzione di alcuni interrupt (cioè un gestore di segnale o altra variabile atomica vicina), probabilmente non si utilizzerà volatile (poiché la maggior parte dei compilatori la ottimizzeranno se non abbastanza vicino).

In caso contrario, come altri hanno detto .. solo usarlo poi esaminare l'asm discariche per vedere se il compilatore in realtà d'accordo con te :)

In alcuni casi, ad esempio alcune versioni di gcc .. la sua pena di verificare quelli discariche.

Problemi correlati