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
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.