2013-04-28 18 views
23

Mi chiedo sui diversi usi della volatilità parola chiave in combinazione con registro, const e statici parole chiave. Non sono sicuro di quali sono gli effetti, quindi penso:const volatile, registrarsi volatile, statica volatili in C++

register volatile int T=10; 

Suggerisci il compilatore di memorizzare T in un registro e il valore di T può essere modificato da qualche parte fuori (sistema operativo, hardware, un altro thread)

Il programma stesso non può modificare T, ma T può essere modificato da qualche parte al di fuori del codice.

static volatile int T=10; 

Se T è un membro di una classe di dati significa che tutti gli oggetti della classe hanno lo stesso valore per T e T può essere modificata da qualche parte fuori. Se T è una variabile globale in un file, il codice sorgente in altri file (che fanno parte del progetto) non può accedere a T, ma è possibile accedere a T da qualche parte all'esterno. Se T è una variabile locale in una funzione, una volta che è stata inizializzata rimane in memoria fino alla fine del programma e può essere modificata da qualche parte all'esterno.

I miei pensieri sono corretti e uno sviluppatore C++ esperto può dare un esempio di quanto sopra possa essere utilizzato nelle applicazioni del mondo reale o è molto raro?

+0

Molto bello! +1. Potrebbe anche includere 'mutabile'. –

risposta

26
register volatile int T=10; 

volatile qualificatore significa che il compilatore non può applicare le ottimizzazioni o riordinare l'accesso a T, mentre register è un suggerimento per il compilatore che T saranno utilizzati pesantemente. Se viene preso l'indirizzo di T, il suggerimento viene semplicemente ignorato dal compilatore. Si noti che register è deprecato ma ancora utilizzato.

uso pratico:

non ho mai usato mai sentito il bisogno di essa e non può davvero pensare di qualsiasi momento.


const volatile int T=10; 

const qualificazione significa che il T non può essere modificato tramite il codice. Se si tenta di farlo, il compilatore fornirà una diagnostica. volatile significa ancora lo stesso del caso 1. Il compilatore non può ottimizzare o riordinare l'accesso a T.

uso pratico:

  • Accesso memoria condivisa in modalità di sola lettura.
  • Accesso ai registri hardware in modalità di sola lettura.

static volatile int T=10; 

static qualificazione stoccaggio dà T durata di conservazione statica (C++ 11 §3.7) e internal linkage, mentre volatile ancora governa l'ottimizzazione e riordino.

uso pratico:

  • Uguale a volatile eccezione del fatto che è necessario l'oggetto di avere una durata di stoccaggio statico e di essere inaccessibili da altre unità di traduzione.
+2

Per il secondo, sei sicuro di parlare di oggetti const-volatile *, o di riferimenti const-volatile * (o puntatori a oggetti const-volatile)? Perché non sembra che un oggetto const-volatile possa mappare all'hardware ... – Mehrdad

+1

@Mehrdad: mi riferivo a puntatore a oggetti const-volatile come: 'unsigned char const volatile * hd_addr;' –

+1

Sì, il tuo esempio mostra 'const volatile int T = 10;' che è diverso. :) – Mehrdad