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.