Hi, Was tut das? 30 #define RV3029C2_STATUS_VLOW1 (1 << 2)
30 ist die Zeilennummer. Zum restlichen: Hier ersetzt der Präprozessor sämtliche RV3029C2_STATUS_VLOW1 im Code durch (1 << 2).
0x1 = 0b00000001 um 2 Stellen nach links geshiftet ergibt 0b00000100 = 0x4
C Leghasteniker schrieb: > Ok, > > Und was macht dann 1<<2? Das ist vom Ergebnis her einfach ein Literal. http://de.wikipedia.org/wiki/Literal Der Wert ist 4. Für sich alleine "macht" das gar nichts. Vermutlich wird dieser Wert irgendwo im Code einer Variablen zugewiesen, oder in einer Berechnung verwendet.
Obertroll schrieb: > T.roll schrieb: >> im Code durch (1 << 2) > > und optimieret es zu 0x04 Das wird nicht optimiert, sondern ausgerechnet. KK
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 ;-)
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.
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?
Auf jeden Fall macht das nicht der CPP (C Pre Processor), der ersetzt das wirklich nur 1:1 und macht nichts mit den Werten.
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.
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
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.
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)
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.
:
Bearbeitet durch User
Walter Tarpan schrieb: > http://root.cern.ch/drupal/content/cint > > Der sollte das zur Laufzeit ausrechnen müssen. Ist ja auch ein Interpreter ;-) Aber Patrick kennt sicher auch noch einen Compiler. Wir warten einfach mal.
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? Keine Ahnung, wo das steht. Aber Compilerbauer sind keine Vollidioten. mfg.
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 :-)
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?)
:
Bearbeitet durch User
Guter Einwand mit dem Floating Zeug. Da ist was dran. Allerdings müsste man fragen, ob eine Formel im Code, welche auf unterschiedlichen Maschinen, zu unterschiedlichen Ergebnissen führt, überhaupt noch eine Konstante ist.
Durchaus, es gibt eben vier unterschiedliche, definierte Rundungsverhalten mit IEEE 754 Floats. Fließkommaarithmetik ist nicht exakt. Ist sie fast nie... Der Compiler könnte allerdings durchaus den Rundungsmodus der Zielhardware kennen.
:
Bearbeitet durch User
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.
Quack schrieb: > cyblord ---- schrieb: >> Genau das möchte ich ja von Patrick wissen. Erzähl das nicht MIR! > > Warum stellst du dann nicht genau diese Frage? Habe ich doch getan.
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
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 :-)
C++ hat diesen schönen Qualifier constexpr, der wäre in C imho auch sehr praktisch. int x = readint(); constexpr double y = 3.141 * x; // kompiliert nicht
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.