Spiegazione astratta
Sia C che C ++ hanno il concetto di una macchina astratta . Quando il codice utilizza il valore di una variabile, la macchina astratta dice che l'implementazione deve accedere al valore di quella variabile. Il codice del modulo statement_A; statement_B; statement_C;
deve essere eseguito esattamente nell'ordine specificato. Le espressioni comuni a queste tre istruzioni devono essere ricalcolate ogni volta che si verificano.
Per le macchine astratte, data la sequenza delle affermazioni 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 ricorda che hai assegnato age
il valore di 5. Ogni istruzione che fa riferimento age
deve invece accedere al valore di quella variabile.
Non sarebbe necessaria la volatile
parola chiave se le implementazioni eseguissero rigorosamente il codice C o C ++ secondo le specifiche astratte della macchina. Le macchine astratte C e C ++ non hanno il 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 cose secondo le specifiche astratte della macchina. Il compilatore può assumere che le variabili non volatili non cambino i valori tra le assegnazioni. Finché non infrange la as-if
regola, 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 statement_A
e infine il resto di statement_C
.
Le regole as-if non si applicano alle volatile
variabili. Per quanto riguarda le volatile
variabili e le funzioni, un'implementazione deve fare esattamente ciò che gli hai detto di fare e esattamente nell'ordine in cui gli hai detto di fare le cose.
C'è un aspetto negativo nelle specifiche astratte della macchina: è lento. Un aspetto positivo di C e C ++ rispetto ad altre lingue è che sono abbastanza veloci. Questo non sarebbe il caso se il codice fosse eseguito per queste macchine astratte. Le regole as-if sono ciò che consente a C e C ++ di essere così veloci.
Risposta ELI5
cosa significa quando il compilatore non "ottimizza" l'indirizzo di memoria?
"Ottimizzare" un indirizzo di memoria è un concetto avanzato, qualcosa che non rientra nel regno delle capacità di un bambino di cinque anni. I bambini di cinque anni conformi faranno esattamente ciò che dici loro di fare, né più né meno. Con volatile
, stai dicendo all'implementazione di agire come se fossero le cinque: nessun pensiero, nessuna ottimizzazione fantasiosa. Invece, l'implementazione deve fare esattamente ciò che il codice gli dice di fare.
volatile
variabile e dice 5, e la