Forum: Compiler & IDEs Könnte dieser Ausdruck wegoptimiert werden?


von Martin K. (maart)


Lesenswert?

Kann es passieren, dass mir dieser Ausdruck wegoptimiert wird?
1
uint8_t dummy; // wird nie gelesen
2
3
dummy = SPSR;
4
dummy = SPDR;

von Bernd (Gast)


Lesenswert?

Ja sicher, wenn zB dummy nie wieder verwendet wird

von Oliver S. (oliverso)


Lesenswert?

Wegoptimieren kann der Compiler nur Teile eines fehlerfrei 
kompilierbaren Programms. Soweit kommt der bei den drei Zeilen also gar 
nicht.

Vielleicht formulierst du mal etwas genauer, was das wirkliche Problem 
ist.

Oliver

von Martin K. (maart)


Lesenswert?

1
void spi_senden(void){
2
//mega32
3
#include <avr/io.h>
4
uint8_t dummy; // wird nie gelesen
5
6
SPDR = 15;
7
while(!spif); //Pseudocode: warten bis das SPI-Interruptflag durch die Hardware gesetzt wird
8
dummy = SPSR;
9
 dummy = SPDR;
10
// jetzt können weitere Daten gesendet werden.
11
 }

Sinn und Zweck: Mit den zwei Codezeilen wird das SPI-Interruptflag 
gelöscht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da die hier verwendeten Register als volatile deklariert sein sollten, 
sollte eigentlich das Konstrukt nicht wegoptimiert werden. Sicher geht 
man, wenn "dummy" auch noch als volatile deklariert wird.

von Oliver S. (oliverso)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Da die hier verwendeten Register als volatile deklariert sein sollten,
> sollte eigentlich das Konstrukt nicht wegoptimiert werden.

Zumindest werden die Register dann mit Sicherheit gelesen. Was mit dem 
gelesenen Ergebnis passiert, ist offen. Da aber Ergebnis und dummy eh 
nie verwendet werden, ist das eigentlich auch egal. Insofern könnte man 
an Stelle von

>dummy = SPSR;
>dummy = SPDR;

auch einfach

>SPSR;
>SPDR;

schreiben.

Oliver

von Yalu X. (yalu) (Moderator)


Lesenswert?

Oliver S. schrieb:
> auch einfach
>
>>SPSR;
>>SPDR;
>
> schreiben.

Genau so ist es richtig. Die Dummy-Variable würde der Compiler ohnehin
wegoptimieren, also kann man sie auch gleich weglassen. Man vermeidet
dadurch auch eine Warnung wegen "unused variable", und der Leser des
Codes muss nicht suchen, ob dummy vielleicht doch noch irgendwo anders
verwendet wird.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Yalu X. schrieb:
> Oliver S. schrieb:
>> auch einfach
>>
>>>SPSR;
>>>SPDR;
>>
>> schreiben.
>
> Genau so ist es richtig. Die Dummy-Variable würde der Compiler ohnehin
> wegoptimieren, also kann man sie auch gleich weglassen. Man vermeidet
> dadurch auch eine Warnung wegen "unused variable", und der Leser des
> Codes muss nicht suchen, ob dummy vielleicht doch noch irgendwo anders
> verwendet wird.

Kann man dann auch so ausdrücken, daß die Register gelesen werden, deren 
Inhalt aber nicht verwendet werden.  D.h. die Register werden nur wegen 
der damit verbundenen Seiteneffekte (dem volatile in der Definition) 
gelesen:
1
(void) SPSR;
2
(void) SPDR;

von Martin K. (maart)


Lesenswert?

Vielen Dank für die Antworten, ich werde dann die dummy-Variable 
weglassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.