Third Eye schrieb:
> Was passiert eigentlich, wenn das volatile nicht dort steht?
Das was bei 'nicht volatile' immer passieren kann.
> Meint der Compiler dann, dass lediglich eine Variable übergeben,
> verändert und dann verworfen wird?
Nö. Du übergibst ja nach wie vor einen Pointer.
Aber der Compiler kann durch die Datenflussanalyse zur Auffassung
gelangen, dass in
1 | void function( char *port){
|
2 | while( *port )
|
3 | i = 0;
|
4 | }
|
der Wert *port sowieso immer das gleiche Ergebnis liefern muss und er
den Wert daher nicht bei jedem Schleifendurchlauf erneut bestimmen muss.
Einmal am Anfang genügt - denn der Wert ändert sich ja sowieso nicht.
Sind ja keine Anweisungen da, die dies bewirken könnten.
Genau so wie in
1 | void foo( int x )
|
2 | {
|
3 | while( x )
|
4 | i = 0;
|
5 | }
|
x ja auch immer denselben Wert hat. Denn: wer sollte denn den verändern?
Im zweiten Beispiel ist alles klar. Das ist ein Fehler des
Programmierers und x kann in diesem Beispiel tatsächlich seinen Wert
nicht ändern. Der Programmierer hat hier also (je nach Ausgangswert von
x) eine Endlosschleife gebaut.
Aber im ersten Beispiel ist das nicht so. *port ist ja als Verbindung
nach aussen gedacht. Schliesslich reden wir ja von Portpins. UNd die
können sich sehr wohl verändern. Wenn der Compiler allerdings zur
Auffassung gelangt, dass er *port nicht jedesmal neu auswerten lassen
muss, weil sich der Wert sowieso nicht verändern kann, dann kriegt das
eben das Programm nicht mit, wenn jemand an den Portpins rumspielt.
FAQ: Was hat es mit volatile auf sich