Forum: Compiler & IDEs Staunen über Compiler


von Peter Z. (Gast)


Lesenswert?

Hi, bin am programmieren (AVR Studio 6 / ATtiny 84) und staune mal 
wieder über den Compiler:
1
        if(Taste == up) Frequenz += Offset;
2
        if(Frequenz > 999999999999) Frequenz -= Offset;
3
        if(Taste == down) Frequenz -= Offset;
4
        if(Frequenz < 0) Frequenz += Offset;
Das war meine erste Version.

Diese zweite Version hier spart 124 Byte Programm Memory!!!
1
        if((Taste == up) && ((Frequenz + Offset) <= 999999999999)) Frequenz += Offset;
2
        if((Taste == down) && ((Frequenz - Offset) >= 0)) Frequenz -= Offset;
Kann es z.B. sein, das der Compiler das Zwischenergebnis
(Frequenz + Offset)
aus dem Vergleich für die Zuweisung += speichert?!

von Kollege (Gast)


Lesenswert?

Der Compiler hat doch noch keine Ergebnisse, die gibt es erst zur 
Laufzeit, aber er analysiert "die Logik", d.h. er erkennt wenn man 
Ausdrücke zusammenfassen kann.

von Peter II (Gast)


Lesenswert?

kann es sein das Frequenz volatile ist?

von Dumdi D. (dumdidum)


Lesenswert?

Peter Zz schrieb:
> Kann es z.B. sein, das der Compiler das Zwischenergebnis
> (Frequenz + Offset)
> aus dem Vergleich für die Zuweisung += speichert?!

Kann sein, siehst Du wenn Du nach Assembler compilierst.

Dir ist aber auch klar, das die beiden Code-Schnipsel nicht ganz genau 
die gleiche Funktion haben, oder? (im ersten Code geht das Programm aus 
einem nicht-validen Zustand automatisch in einen gültigen, beim 2ten 
nicht)

von A. H. (ah8)


Lesenswert?

Worüber ich erst einmal staune ist die 999999999999. Das ist hexadezimal 
0xE8D4A50FFF, also 5 Bytes. Meines Wissens nach nimmt der Compiler 
standardmäßig für ein solches Literal den kleinsten Integer-Typ an, der 
den Wert noch repräsentieren kann. In diesem Fall wären das wohl 8 Bytes 
bzw. 64 Bit. Ist das wirklich das was Du willst?

Ich würde mir erst einmal Klarheit über die beteiligten Wertebereiche 
verschaffen. Dann kannst Du Dir das was der Compilers daraus macht im 
Assemblercode ansehen.

von Peter Z. (Gast)


Lesenswert?

dumdi dum schrieb:
> Dir ist aber auch klar, das die beiden Code-Schnipsel nicht ganz genau
> die gleiche Funktion haben, oder? (im ersten Code geht das Programm aus
> einem nicht-validen Zustand automatisch in einen gültigen, beim 2ten
> nicht)

Ups, jetzt seh ich es auch!
Hat sich bisher nur nicht böse auswirken können, da beim Lesen aus dem 
Eeprom Werte außerhalb des gültigen Bereiches abgefangen werden:
1
  signed long long int Frequenz;
2
3
  eeprom_read_block(&Frequenz,&Eeprom_1,sizeof(Frequenz));
4
  if(Frequenz > 999999999999) Frequenz = 0;

von Christian B. (casandro)


Lesenswert?

Compiler können inzwischen ziemlich viel optimieren. Fefe hat da mal 
einen schönen Vortrag namens "Know your Compiler" gehalten.
https://media.ccc.de/browse/conferences/camp2007/cccamp07-en-1952-Know_your_compiler.html
Bedingt gilt das auch für kleine Systeme und eingeschränkte Compiler. 
(k.A. was bei dem AVRStudio dabei ist)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Christian Berger schrieb:
> Bedingt gilt das auch für kleine Systeme und eingeschränkte Compiler.
> (k.A. was bei dem AVRStudio dabei ist)

Wenn ein Compiler anbei ist, dann avr-gcc.  GCC ist wahrlich nicht 
"eingeschränkt".

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.