Come si dichiara un membro particolare di una struttura come volatile?In C, come si dichiarano i membri di una struttura come volatili?
risposta
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.
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.
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.
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.
- 1. C# ThreadStatic + membri volatili che non funzionano come previsto
- 2. Come si dichiarano i campi "Chiave" nei tipi anonimi C#?
- 3. Come si dichiarano le costanti di stringa in C?
- 4. I membri di dati volatili sono semplicemente copiabili?
- 5. Inizializzazione dei membri quando si eredita dalla struttura esterna C
- 6. Come si dichiarano i valori di una voce del dizionario come mutabili?
- 7. come definire una struttura come in C
- 8. Ottieni l'elenco dei membri della struttura C
- 9. Come si dichiarano gli array bidimensionali in javascript?
- 10. Come si dichiarano due variabili di tabella con strutture identiche?
- 11. Come restituire una struttura anonima in C?
- 12. C++ come eliminare una struttura?
- 13. Come si ordina in modo efficiente una struttura quadrupla in C++?
- 14. Membri della struttura Dirent
- 15. Estrarre i campi di una struttura C
- 16. Come si dichiarano più variabili mutabili allo stesso tempo?
- 17. In che modo il costruttore di movimento sintetizzato C++ è interessato da membri volatili e virtuali?
- 18. Come dichiarare variabili volatili in Swift
- 19. Che significato hanno questi volatili con i puntatori in C?
- 20. Come si dichiarano le proprietà a livello di classe in Objective-C?
- 21. Come posso ottenere l'indirizzo di una struttura in C?
- 22. sindacati in C#: Struttura membri non sembrano essere stati allineati
- 23. Come posso nascondere la dichiarazione di una struttura in C?
- 24. Come utilizzare enum all'interno di una struttura in ANSI C?
- 25. Definire i membri statici in C++
- 26. Casting una struttura C in un altro
- 27. Come enumerare i membri dell'oggetto COM in C#?
- 28. Come si leggono i valori in una struttura utilizzando i puntatori?
- 29. Perché il MetaModel JPA2 viene generato con membri volatili?
- 30. C# dichiarano variabile in istruzione if
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
Hai ragione. Non sapevo che stavo pensando quando ho detto DMA, intendevo MMIO. Ho modificato la risposta a qualcosa di meglio (spero). –
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. –