mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Präprozessor und Macros


Autor: beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

wenn ich (z.B.) so eine Macro definiere:
#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ß

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen Dank

Ist das irgendwo in der Doku vom gcc?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: beginner (Gast)
Datum:

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

Autor: beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K.

Ups! ich war zu langsam!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:

void foo (int a, int b)
{
    return (a || b) ? 0 : 1;
}

kann zB umgewandelt werden in
    (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
if (a && *a)
geht das natürlich nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.