Präprozessor und Macros

Gast #1741837
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.
#1741919
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.
Persönliche Seite #1742363
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.