2012-11-03 1 views

risposta

7

ad esempio:

x = 0; 

Se x non è volatile, il compilatore vedrà che è inutilizzato e probabilmente eliminare (o la dichiarazione x = 0; o anche la variabile stessa) completamente dal codice generato come ottimizzazione.

Tuttavia, la parola chiave volatile è esattamente per impedire al compilatore di eseguire questa operazione. Fondamentalmente dice al generatore di codice "qualunque cosa tu pensi che questa variabile sia/non fa, non mi indovini, ne ho bisogno". Quindi il compilatore tratterà la variabile volatile come acceduta e emetterà il codice effettivo corrispondente all'espressione.

+0

L'ho appena testato e tu hai ragione. Lo store 'x = 0' viene eliminato nella versione non volatile in gcc -O2, mentre non è nella versione volatile. –

+0

"hai ragione" - ho sempre ragione. (JK): P Prego. –

+2

Questo è un errore di "generalizzazione frettolosa" dallo specifico al generale. :) –

2

Questo potrebbe non essere l'esempio più breve, ma è un uso comune di volatile in sistemi embedded, assumendo x punti per l'indirizzo di un registro, se volatile non viene utilizzato, il compilatore assumerà il valore di x doesn 't cambiare e rimuoverà il loop:

volatile long *x = (long*) REGISTER_BASE; 
while (!(x&0x01)) { 
    //do nothing; 
} 
0

si può anche provare questo:

x=1; 
x=2; 
return x; 

Accendere l'ottimizzazione di un chec k lo smontaggio per entrambi.