2012-11-03 16 views

Antwort

7

zum Beispiel:

x = 0; 

Wenn x nicht volatile ist, wird der Compiler sieht, dass es ungenutzt ist und wird es wahrscheinlich beseitigen (entweder die x = 0; Anweisung oder auch die Variable selbst) vollständig aus dem generierten Code als Optimierung.

Das Schlüsselwort volatile ist jedoch genau dafür, dass der Compiler dies verhindert. Es teilt im Grunde den Code-Generator "was auch immer Sie denken, dass diese Variable ist/tut, nicht zweite rate mich, ich brauche es." Dann behandelt der Compiler die flüchtige Variable als zugegriffen und es wird den tatsächlichen Code ausgeben, der dem Ausdruck entspricht.

+0

Ich habe es gerade getestet und Sie haben Recht. Der Speicher 'x = 0' wird in der nichtflüchtigen Version in gcc-O2 eliminiert, während dies bei der volatilen Version nicht der Fall ist. –

+0

"Sie haben Recht" - Ich habe immer Recht. (JK): P Gern geschehen. –

+2

Dies ist ein "voreiliger Verallgemeinerung" Trugschluss von den spezifischen zu allgemein. :) –

2

Dies kann nicht das kürzeste Beispiel sein, aber es ist eine gemeinsame Nutzung von volatile in eingebetteten Systemen, unter der Annahme, x zeigt auf die Adresse eines Registers, wenn volatile nicht verwendet wird, wird der Compiler den Wert x doesn nehmen ‚t ändern und entfernen Sie die Schleife:

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

Sie können auch versuchen, diese:

x=1; 
x=2; 
return x; 

Schalten Sie Optimierung ein chec k die Demontage für beide.