Spiegazione astratta
Sia C che C ++ hanno un concetto di macchina astratta . Quando il codice utilizza il valore di alcune variabili, la macchina astratta dice che l'implementazione deve accedere al valore di quella variabile. Il codice della forma statement_A; statement_B; statement_C;
deve essere eseguito esattamente nell'ordine specificato. Le espressioni comuni a queste tre affermazioni devono essere ricalcolate ogni volta che si verificano.
Per le macchine astratte, data la sequenza di istruzioni statement_A; statement_B; statement_C;
, l'implementazione deve prima eseguire statement_A
nella sua interezza, quindi statement_B
e infine statement_C
. L'implementazione non può ricordare che hai assegnato age
al valore di 5. Ogni istruzione che fa riferimento a age
deve invece accedere al valore di tale variabile.
Non ci sarebbe bisogno della parola chiave volatile
se le implementazioni eseguono rigorosamente codice C o C ++ secondo le specifiche della macchina astratta. Le macchine astratte C e C ++ non hanno alcun concetto di registri, nessun concetto di sottoespressioni comuni e l'ordine di esecuzione è rigoroso.
Entrambe le lingue hanno anche regole as-if . Un'implementazione è conforme allo standard fintanto che l'implementazione si comporta come se avesse eseguito le operazioni secondo le specifiche della macchina astratta. Il compilatore può assumere variabili non volatili che non cambiano i valori tra le assegnazioni. Finché non interrompe la regola as-if
, la sequenza statement_A; statement_B; statement_C;
potrebbe essere implementata eseguendo parte di statement_C
, quindi parte di statement_A
, quindi tutto statement_B
, quindi il resto di statement_A
e infine il resto di statement_C
.
Quelle regole as-if non si applicano alle variabili volatile
. Per quanto riguarda le variabili e le funzioni di volatile
, un'implementazione deve fare esattamente ciò che gli hai detto di fare, esattamente nell'ordine in cui gli hai detto di fare le cose.
C'è uno svantaggio nelle specifiche astratte della macchina: è lento. Un aspetto positivo di C e C ++ rispetto ad altre lingue è che sono piuttosto veloci. Questo non sarebbe il caso se il codice fosse eseguito per queste macchine astratte. Le regole as-if sono ciò che permette a C e C ++ di essere così veloci.
risposta ELI5
what does it mean when the compiler doesn't "optimize away" the memory address?
"Ottimizzare" un indirizzo di memoria è un concetto avanzato, qualcosa che non rientra nel campo delle capacità di un bambino di cinque anni. I compiacenti di cinque anni faranno esattamente quello che tu dici loro di fare, né più né meno. Con volatile
, stai dicendo all'implementazione di comportarsi come se fosse cinque: nessun pensiero, nessuna ottimistica fantasia. Invece, l'implementazione deve fare esattamente ciò che il codice gli dice di fare.