Altre risposte hanno sottolineato l'importanza di volatile
qui e non ho nulla da aggiungere a questo. Tuttavia, voglio dire quanto sia importante che un tale costrutto esista, perché è utile. Dalla mia esperienza di progettazione hardware, molte volte l'interfaccia tra una CPU e un blocco logico in HW si basa su scritture e letture di memoria. Ciò significa che quando una CPU legge un registro dall'HW, accade qualcosa (ad esempio, l'interruzione cancella, anticipa le code e molte altre opzioni).
Ora, una volta che si esegue l'accesso al pleaseOptimizeMeOut
, dal momento che è volatile
il compilatore solo assume si potrebbe avere fatto solo per l'effetto collaterale, quindi sarebbe assolutamente sbagliato per ottimizzarlo. Supponiamo che la variabile sia mappata su una coda HW e che tu volessi semplicemente far avanzare la coda senza averne effettivamente preso un valore.
Detto questo, mappare le variabili ai registri durante la lettura ha effetti collaterali è IMHO non una buona pratica, e sarebbe meglio incapsularlo con una chiamata di funzione, esattamente per il motivo che dimostra la tua domanda - in alcuni casi è confuso.
Mappare le variabili ai registri senza effetti secondari è molto utile e ampiamente utilizzato, tuttavia.
fonte
2010-09-27 04:37:18
Questo effetto è un po 'il "punto" di 'volatile'. – SingleNegationElimination