Folks,Significato volatile per array e typecasts
considerare questo (abominevole) pezzo di codice:
volatile unsigned long a[1];
unsigned long T;
void main(void)
{
a[0] = 0x6675636b; /* first access of a */
T = *a;
*(((char *)a) + 3) = 0x64; /* second access of a */
T = *a;
}
... la domanda: è ((char *)a)
volatile o non volatile?
Questo solleva una domanda più ampia: dovrebbe esserci una dipendenza tra i due accessi di a? Cioè, il buon senso umano dice che esiste, ma lo standard C99 dice che le cose volatili non sono alias delle cose non volatili - quindi se ((char *)a)
non è volatile, allora i due accessi non sono alias, e non c'è una dipendenza.
Più correttamente, C99 6.7.3 (paragrafo 5) legge:
"Se viene fatto un tentativo per fare riferimento a un oggetto definito con un tipo volatili qualificato attraverso l'uso di un Ivalue con non volatile -qualificato il tipo, il comportamento non è definito. "
Così, quando abbiamo typecast a
, si applica il qualificatore volatili?
Penso che tu abbia risposto alla tua stessa domanda, non è definito. In realtà non penso che la volatilità abbia alcun effetto, è una sorta di suggerimento del compilatore che viene ignorato sulle piattaforme comuni. –
@ AndrewTomazos-Fathomling "Non penso che la volatilità abbia alcun effetto, è una sorta di suggerimento del compilatore che viene ignorato sulle piattaforme comuni" Potresti pensare a 'register'. Il qualificatore di tipo "volatile" ha un significato molto significativo nel codice C del 2012, dal momento che le mode del momento (per C) sono l'ottimizzazione aggressiva e le applicazioni incorporate, entrambe possono coesistere solo con suggerimenti del programmatore come "volatile". –
@ AndrewTomazos-Fathomling, no 'volatile' non è solo un suggerimento, è un ordine per caricare il valore dalla memoria a * ogni * accesso. –