Domanda

C'è qualche ragione per cui il compilatore non può ottimizzare i seguenti 2 dichiarazioni nella principale anche ho acceso pienamente l'ottimizzazione in Visual C ++? Qualsiasi effetto collaterale per accedere a una variabile int in memoria?

int _tmain(int argc, _TCHAR* argv[])
{
    volatile int pleaseOptimizeMeOut = 100;

    (pleaseOptimizeMeOut);

    return 0;
}
È stato utile?

Soluzione

Non può ottimizzarli fuori perché si è dichiarata la variabile di essere volatile. Carichi e negozi per volatile oggetti qualificati sono parte degli effetti "visibili esternamente" della C macchina astratta.

(A proposito, ci sono un sacco di effetti collaterali quando si accede una variabile in memoria, è possibile aggiornare le cache di memoria hardware tra cui il TLB, e forse anche causa errori di pagina E la memoria il processo. è in esecuzione in potrebbe essere occhi indiscreti da un altro processo, come un debugger).

Altri suggerimenti

volatile dice esplicitamente al compilatore di non ottimizzare per quella variabile.

Su alcuni computer, dispositivo di I O è modellato / come memoria di lettura / scrittura. Questo è il tipo di situazione in cui volatili sia correttamente utilizzato ... si sta dicendo al compilatore esplicitamente di non presumere che le operazioni di variabili non sono importanti o può essere ottimizzato ....

Altre risposte sottolineato l'importanza di volatile qui, e non ho nulla da aggiungere a quello. Tuttavia, voglio dire quanto sia importante che esista una tale costrutto, perché è utile. Dalla mia esperienza di progettazione hardware, molte volte l'interfaccia tra una CPU e un blocco di codice in HW è basato sulla scrittura di memoria e legge. Ciò significa che quando una CPU legge qualche registro dalla HW, succede qualcosa (vale a dire di interrupt si dirada, i progressi di coda, e molte altre opzioni).

Ora, una volta che si esegue l'accesso al pleaseOptimizeMeOut, dal momento che di volatile il compilatore solo presuppone che potrebbe avere fatto solo per l'effetto collaterale , quindi sarebbe assolutamente sbagliato per ottimizzarlo. Supponiamo che la variabile è associata a una coda di HW e si voleva solo far avanzare la coda senza prendere effettivamente un valore da esso.

Detto questo, le variabili di mappatura per i registri quando la lettura ha effetti collaterali è IMHO non è una buona pratica, e sarebbe meglio per incapsulare con una chiamata di funzione, esattamente per la ragione tua domanda dimostra -. È confuso in alcuni casi

variabili Mappatura registri senza effetti collaterali è molto utile e ampiamente utilizzato, tuttavia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top