Gast
#3519510
Hi, Was tut das? 30 #define RV3029C2_STATUS_VLOW1 (1 << 2)
|
Anzeige
|
C Frage an die Könner
Gast
#3519510
Hi, Was tut das? 30 #define RV3029C2_STATUS_VLOW1 (1 << 2)
Gast
#3519513
30 ist die Zeilennummer. Zum restlichen: Hier ersetzt der Präprozessor sämtliche RV3029C2_STATUS_VLOW1 im Code durch (1 << 2).
Gast
#3519519
T.roll schrieb: > im Code durch (1 << 2) und optimieret es zu 0x04
Gast
#3519524
Ok, Und was macht dann 1<<2? Danke
Gast
#3519527
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.
Gast
#3519530
Lesestoff: Bitmanipulation
Gast
#3519535
Dankeschön. Einfach, wenn man es weiß;-)
Gast
#3519561
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 ;-)
Gast
#3519667
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
#3519672
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.
Gast
#3519743
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. http://root.cern.ch/drupal/content/cint Der sollte das zur Laufzeit ausrechnen müssen. SCNR 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?) 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.
Gast
#3520105
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.
Gast
#3520111
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.
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:
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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|