Tutto questo è descritto in C11 5.1.2.3
L'esecuzione del programma
/-/
Accesso ad un oggetto volatile, modifica di un oggetto, la modifica di un file, o chiamare un funzione che fa una di queste operazioni sono tutti gli effetti , che sono cambiamenti nello stato di l'ambiente di esecuzione. La valutazione di un'espressione in generale include entrambi i calcoli del valore e l'inizio di effetti collaterali.
Sequenced prima è una, transitivo, a coppie relazione asimmetrica tra le valutazioni eseguite da un unico filo, che induce un ordine parziale tra tali valutazioni. Dato qualsiasi due valutazioni A e B, se A viene sequenziato prima B, allora l'esecuzione di A deve precedere l'esecuzione di B. ...
La presenza di un punto sequenza tra la valutazione delle espressioni A e B implica che ogni valore computazione e effetto collaterale associato con A viene sequenza prima di ogni valore computazione e effetto collaterale associato con B.
/-/
Un'implementazione effettiva necessità di non valutare parte di un'espressione se può dedurre che il suo valore non è usato e che no vengono prodotti gli effetti collaterali necessari (compresi quelli causati dal richiamo di una funzione o dall'accesso a un oggetto volatile).
/-/
dei minimi requisiti su conforme attuazione sono:
- Accessi agli oggetti volatili vengono valutate rigorosamente secondo le regole della astratto macchina.
Questo non è esattamente facile da interpretare, ma che cosa significa grosso modo in parole povere è: dal momento che l'accesso degli oggetti volatili è un effetto collaterale, il compilatore non è permesso di ottimizzare la via tali accessi, né è ha permesso di sequenziarli in un ordine diverso, che altrimenti avrebbe fatto per ottenere prestazioni migliori su una CPU con previsione cache/istruzione delle istruzioni, o semplicemente prestazioni migliori perché aveva certi valori comodamente memorizzati in alcuni registri della CPU.
(Lo standard C11 afferma esplicitamente che gli oggetti non volatili sono garantiti per essere thread-safe, il valore di un oggetto instabile dopo un cambio di contesto è un comportamento specificato.)
EDIT un esempio
dato il codice
volatile int x;
volatile int y;
volatile int z;
x=i;
y=something;
z=i;
poi il compilatore non è permesso di riordinare le istruzioni del file eseguibile per
x=i;
z=i;
y=something
perché l'accesso a y deve essere sequenziato prima dell'accesso a z. C'è un punto di sequenza al punto e virgola. Ma se le variabili non fossero state volatili, sarebbe corretto per il compilatore riordinarle, se potesse determinare che non avrebbe influenzato il risultato del programma.
Ecco uno sfondo sui punti di sequenza - http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html –
Significa che durante l'ottimizzazione e le passate di generazione di istruzioni, quando il codice/istruzioni possono essere diversamente riordinati , interleaved, ecc. per un'esecuzione più efficiente, le istruzioni che accedono alle variabili volatili sono notevolmente più limitate nel modo in cui possono essere influenzate. – twalberg