Forum: Mikrocontroller und Digitale Elektronik Präprozessor und Macros


von beginner (Gast)


Lesenswert?

Hallo zusammen,

wenn ich (z.B.) so eine Macro definiere:
1
#define  K    (10*5)

wird das Ergebnis in der compile-Zeit berechnet und überall nur das 
Ergebniss eingefügt, oder doch zur Laufzeit immer wieder die 
Mult-Operation durchgeführt?

Gruß

von Walter T. (nicolas)


Lesenswert?

Der Präprozessort setzt nur an allen Stellen, wo "K" steht "5*10" ein. 
Der Kompiler sollte dann daraus ein fixes "50" machen, daß das zur 
Laufzeit nicht mehr berechnet werden muß.

Grüße
Nicolas

von Maxx (Gast)


Lesenswert?

Die Makros sind reine Textersetzungen. Das heisst der Text (10*5) wird 
überall da im Code eingesetzt wo das K steht.

Der Präprozessor kümmert sich nicht um die Auswertung.


Der Compiler wird aber feststellen, dass der Wert konstant ist und den 
Wert ausrechnen und so verwenden. Das Programm wird nicht zig mal 10*5 
rechnen.

von beginner (Gast)


Lesenswert?

ok, vielen Dank

Ist das irgendwo in der Doku vom gcc?

von (prx) A. K. (prx)


Lesenswert?

Das mit der Textersetzung steht im C Buch. Dass sowas vom Compiler 
berechnet wird gehört da zwar eigentlich auch rein, steht aber nicht 
zwangsläufig in lesbarer Form drin.

von beginner (Gast)


Lesenswert?

@A.K:
also im C Buch steht dass der Compiler auf jeden Fall die Berechnung nur 
einmal macht?

von beginner (Gast)


Lesenswert?

@A.K.

Ups! ich war zu langsam!

von Karl H. (kbuchegg)


Lesenswert?

beginner schrieb:
> @A.K:
> also im C Buch steht dass der Compiler auf jeden Fall die Berechnung nur
> einmal macht?

Das wirst du so in einem allgemeinen C-Buch nicht finden. Denn das fällt 
unter Optimierung. Und aus C-Sicht bedeutet Optimierung nur: Der 
Compiler darf machen was er will, solange sich für dich das Ergebnis 
nicht ändert. Niemand schreibt einem Compiler vor, welche Optimierungen 
er machen muss und welche nicht (*)

Aber:
Das ist eine der Optimierungen, von denen man getrost ausgehen kann, 
dass sie jeder Compiler durchführt.

(*) Eine Ausnahme gibt es.
Shortcut Evaluation bei && und ||
Die muss der Compiler machen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:

> Das wirst du so in einem allgemeinen C-Buch nicht finden. Denn das fällt
> unter Optimierung. Und aus C-Sicht bedeutet Optimierung nur: Der
> Compiler darf machen was er will, solange sich für dich das Ergebnis
> nicht ändert. Niemand schreibt einem Compiler vor, welche Optimierungen
> er machen muss und welche nicht (*)
>
> Aber:
> Das ist eine der Optimierungen, von denen man getrost ausgehen kann,
> dass sie jeder Compiler durchführt.

Etwa anders sieht es hingegen aus, sobald Gleitkomma-Arithmetik ins 
Spiel kommt. Hier muss der Compiler genau wissen, wie sich die 
Targetmaschine verhält. Da der Rounding-Mode zur Laufzeit umgestellt 
werden kann, kann die Compiler nicht immer wissen, wie es die Arithmetik 
auszuführen hat. Um das zu kennzeichnen kennt gcc den Schalter 
-frounding-math (oder so).

Optimierungen wie double a=sin(2.0) sind eine Sache, die gcc inzwischen 
am lernen ist bzw. gelernt hat. Das Problem ist hier, daß man nicht die 
float-Einheit des Host-Rechners verwenden kann, sondern das ganze in 
Software machen muss. Das ist auch der Grund, warum jüngere 
gcc-Versionen zum Generieren die Pakete mpfr, gmp und mpc benötigen.

> (*) Eine Ausnahme gibt es.
> Shortcut Evaluation bei && und ||
> Die muss der Compiler machen.

Auch hier gilt das gleiche wie für alle Optimierungen: Der Compiler darf 
es tun, wenn er nachweisen kann, daß der Effekt auf die abstrakte 
Maschine der gleiche ist:
1
void foo (int a, int b)
2
{
3
    return (a || b) ? 0 : 1;
4
}

kann zB umgewandelt werden in
1
    (a | b) ? 0 : 1;

was je nach Architektur günstiger ist, weil kein Sprung benötigt wird. 
Analoge Fälle gibt es für &&, und gcc führt solche Optimierungen auch 
aus. If Fällen wie
1
if (a && *a)
geht das natürlich nicht.

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.