C Frage an die Könner

Gast #3519667
Lesenswert?

Mark Brandis schrieb:
> C Leghasteniker schrieb:
>> Ok,
>>
>> Und was macht dann 1<<2?
>
> Das ist vom Ergebnis her einfach ein Literal.

Nein. Literale sind Werte, die direkt im Code stehen. 1 und 2 sind 
Literale. Das Ergebnis von 1<<2 dagegen nicht.

Mark Brandis schrieb:
> Korinthenkacker schrieb:
>> Obertroll schrieb:
>>> T.roll schrieb:
>>>> im Code durch (1 << 2)
>>>
>>> und optimieret es zu 0x04
>>
>> Das wird nicht optimiert, sondern ausgerechnet.
>
> Beim Kompilieren. Kann man so gesehen auch als Optimierung betrachten
> ;-)

Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss 
würde ich nicht von Optimierung sprechen.
Gast #3519743
Lesenswert?

Patrick schrieb:
> Rolf Magnus schrieb:
>> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss
>
> Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen muss
> und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei
> Linksschiebeoperationen daraus macht?

ISO C sagt zwar nicht, daß das so gemacht werden muß (deshalb auch "mehr 
oder weniger"), aber es sagt, daß 1<<2 eine "integer constant 
expression" ist und damit überall benutzt werden kann, wo eine Konstante 
möglich ist, also z.B. auch als Größe eines statischen Arrays.
#3519754
Lesenswert?

Patrick schrieb:
> Rolf Magnus schrieb:
>> Da es mehr oder weniger schon vom Compiler ausgerechnet werden muss
>
> Wieso; wer sagt das? Wo steht, dass der Compiler das ausrechnen *muss*
> und nicht z. B. eine Zuweisung des Wertes "1" gefolgt von zwei
> Linksschiebeoperationen daraus macht?

Mich würde interessieren ob es einen Compiler (oder eine Compileroption) 
gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit 
ausrechnet, und aus welchem Grund dies gemacht wird.

Danke für die Aufklärung.

gruß cyblord
#3519764
Lesenswert?

Option wäre eventuell möglich.
Aber abgesehen davon regelt das der Markt. Wenn ein C Compiler auf den 
Markt kommt, der die trivialste aller Optimierungen nicht beherrscht, 
Constant Folding, dann verschwindet der schneller wieder vom Markt als 
die Installation dauern würde.
Persönliche Seite #3519972
Lesenswert?

cyblord ---- schrieb:
> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
> ausrechnet, und aus welchem Grund dies gemacht wird.

Welchen Sinn hätte das denn? Wenn du den Wert wissen willst, ist es egal 
(printf oder C-kompatibler Taschenrechner, die gibt es wie Sand am Meer. 
Zsh und Emacs haben von denen auch das eine odere andere... dutzend 
eingebaut :D)
#3519975
Lesenswert?

Marian B. schrieb:
> cyblord ---- schrieb:
>> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
>> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
>> ausrechnet, und aus welchem Grund dies gemacht wird.
>
> Welchen Sinn hätte das denn?

Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR!

Im Gegensatz zu diesem Vogel habe ich nicht angedeutet, nicht jeder 
Compiler würde Konstanten auch als Konstanten auffassen sondern von der 
Zielmaschine erst ausrechnen lassen.
#3520005
Lesenswert?

Rolf Magnus schrieb:
> Mark Brandis schrieb:
>> C Leghasteniker schrieb:
>>> Ok,
>>>
>>> Und was macht dann 1<<2?
>>
>> Das ist vom Ergebnis her einfach ein Literal.
>
> Nein. Literale sind Werte, die direkt im Code stehen. 1 und 2 sind
> Literale. Das Ergebnis von 1<<2 dagegen nicht.

Meinetwegen steht die 4 als Literal nicht im C-Code, aber sie steht doch 
sicherlich im daraus erzeugten Assembler-Code. Spätestens dort ist sie 
dann ein Literal :-)
(Firma: Brainit GmbH) #3520039
Lesenswert?

cyblord ---- schrieb:
> Mich würde interessieren ob es einen Compiler (oder eine Compileroption)
> gibt, welche eine zur Compilezeit bekannte Konstante, zur Laufzeit
> ausrechnet, und aus welchem Grund dies gemacht wird.

Im Fließkomma-Bereich in Kombination mit Cross-Compiling wird oft 
constant folding deaktiviert, da das Rundungsverhalten der Zielmaschine 
auf dem Compile-Host nicht bekannt ist.

Bekanntes Beispiel ist avr-gcc, der ohne -ffast-math auch kein (bzw. nur 
ein eingeschränktes) constant folding auf floats durchführt. (oder wars 
constant propagation?)
Gast #3520105
Lesenswert?

cyblord ---- schrieb:
> Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR!

Warum stellst du dann nicht genau diese Frage?

> Im Gegensatz zu diesem Vogel habe ich nicht angedeutet,

Er hat nichts dergleichen angedeutet. Das findet mal wieder nur in 
deinem Kopf statt. Er hat lediglich gesagt, dass der Compiler das nicht 
tun muss. Wenn du anderer Meinung bist, dann zitiere doch einfach die 
passende Stelle aus dem Standard, statt hier wieder eine Show ab zu 
ziehen.
Gast #3520111
Lesenswert?

Naja,
wenn das Ausrechnen der Sinn des Programms selbst ist und recht lang 
dauert,
dann sollte das der Compiler nicht tun.
Also wenn Du ein Programm schreibst, dass Pi auf 100Mio Stellen 
ausrechnet,
dann moechtest Du nicht, dass der Compiler das macht, auch dann wenn der
Programmaufruf
PiAufNStellen(100000000);
ein konstanter Ausdruck waere.

Andreas
(Firma: Brainit GmbH) #3520125
Lesenswert?

cyblord ---- schrieb:
> Allerdings müsste man fragen, ob eine Formel im Code, welche auf
> unterschiedlichen Maschinen, zu unterschiedlichen Ergebnissen führt,
> überhaupt noch eine Konstante ist.

es kommt (wie immer) darauf an. Diesen Kelch hab ich vor einigen Monaten 
schon herumgetragen (gabs sogar hier einen Thread dazu). Anfangs war ich 
begeistert von fast-math, weil es meinen Code signifikant verschnellert 
und verkleinert hat, allerdiings hab ich das auch gleich schnell wieder 
abgedreht, weil dann an anderen Stellen was nicht mehr funktioniert hat 
(irgendwas mit INF und/oder NAN oder so...)

Schlußendlich kann man den Compiler "bitten" doch etwas zu optimieren, 
es kommt auf die Reihenfolge und die Klammerung an.
1
double calc (double x) {
2
   return 3.14 * x / 2.0;
3
}
macht wirklich was da steht: 3.14 mit x multiplizieren und danach 
dividieren, man findet im asm-code danach wirklich einen fmul und einen 
fdiv-aufruf (oder wie immer diese lib-funktions heissen)

schreibt man aber:
1
return (3.14 / 2.0) * x;
dann hat man nur eine Multiplikation

Das Wissen um dieses Verhalten ist grad auf dem AVR nicht ganz unwichtig 
:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren