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ß
|
Forum: Mikrocontroller und Digitale Elektronik Präprozessor und MacrosHallo zusammen, wenn ich (z.B.) so eine Macro definiere:
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ß 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 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. 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. @A.K: also im C Buch steht dass der Compiler auf jeden Fall die Berechnung nur einmal macht? 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. 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:
kann zB umgewandelt werden in
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
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.
|
|