Können funktionen schon beim kompilieren ausgeführt werden?
-
Spielerei? pohhh
-
Klingelmann schrieb:
Theoretisch ist es ja möglich das eine funktion die mit konstanten argumenten aufgerufen wird (und auch sonst nur konstante werte benutzt) schon beim kompilieren berechnet wird, also zur laufzeit nicht mehr berechnet werden muss.
Machen compiler soetwas? Gibt es in C++ eine möglichkeit explizit zu sagen, dass der compiler dies tun soll?
Also das der compiler quasi
a=ableitung("x2+2*x((x2)-(1/x3))+ln(7+x)","x");
ersetzt durch
a="2*x+2*x(x2-1/x3)*((2*x+3/x4)*ln(x)+(x2-1/x3)/x)+1/(7+x)";Das klassiche Beispiel ist hierbei Fakultät berechnen
template<int n> struct Fakultaet { enum { ergebnis = n * Fakultaet<n-1>::ergebnis }; }; struct Fakultaet<0> { enum { ergebnis = 1 }; };
-
defob schrieb:
Spielerei? pohhh
Ich hab gesagt oft, nicht immer.
-
Hmm wofür braucht man denn so etwas? *unwissend ist*
Dann kannst du es doch gleich zu Fuss errechnen und den Wert eingeben und dann kompilieren?
-
Gast1001 schrieb:
Hmm wofür braucht man denn so etwas? *unwissend ist*
Dann kannst du es doch gleich zu Fuss errechnen und den Wert eingeben und dann kompilieren?Ja also, wenn du Fakultaet von 10 auswenfig weißt, dann ist ja gut. Das ist ja auch mehr zu rVeranschaulichung. Lies mal Modern C++ Design: Generic Programming and Design Patterns Applied
by Andrei Alexandrescu (Author)
-
Warum soll ich das lesen, wovon handelt das?
Außerdem ist es doch dämlich funktionen (egal ob iterativ oder rekursiv) einzubauen die dir dann die fakultät berechnen, da kann ich doch eben den windowstaschenrechner nutzen und gut ist?!
Ich seh den sinn net
-
Gast1001 schrieb:
Warum soll ich das lesen, wovon handelt das?
Außerdem ist es doch dämlich funktionen (egal ob iterativ oder rekursiv) einzubauen die dir dann die fakultät berechnen, da kann ich doch eben den windowstaschenrechner nutzen und gut ist?!
Ich seh den sinn net
Es wird schon zur Compilezeit berechnet. Es wird nicht mehr zur Ausführung berechnet. Frag mal HumeSikkins http://bens.c-plusplus.info/
Der kann dir mehr zu TemplateMetaProgramming erzählen.
-
Aber warum?!
Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein
-
Der Rechner berechnet es doch.
-
Hi,
schau mal hier auf c-plusplus.net.
Marc++us hatte glaub ich mal eine PDF zum Thema Template Metaprogrammierung veröffentlicht.
ChrisM
-
Gast1001 schrieb:
Aber warum?!
Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein
Fakultaet ist natuerlich Sinnlos. da gebe ich dir recht.
Aber nimm zB mal Expressiontemplates.
Hier wird eine Expression zerlegt und als ganzes Ausgewertet, statt als einzelne Teile mit temporären Ergebnissen.Angenommen x und y sind Arrays und der ausdrueck
2*x
multipliziert alle Elemente von x mit 2 und liefert ein array zurück.
1.2*x + x*y;
wird zB zu folgendem
Add<Mult<Scalar<double>, Array<double> >, Mult<Array<double>, Array<double> > >
Hier gibt es keine temporären ergebnisse die sinnlos kopiert werden müssenIn 'C++ Templates' lernst du eine Menge über Templates und ihren sinnvollen einsatz.
-
-
Shade Of Mine schrieb:
Gast1001 schrieb:
Aber warum?!
Warum um die Ecke gehen, wieso nicht mit dem Rechner ausrechnen und den Wert benutzen, bitte ein konkretes Bsp. wofür man so etwas gebrauchen könnte?! Könnte dann ja evt mal interessant sein
Fakultaet ist natuerlich Sinnlos. da gebe ich dir recht.
Aber sehr einfach zu verstehen.
-
Also ich finde Fac<5> im Code eindeutiger als 120, und schneller als den Taschenrechner zu öffnen und das Ergebnis rüberzukopieren ist es auch - davon abgesehen, dass man ja nicht unbedingt direkt ein Literal an Fac<> übergeben muss. Aber ein nicht-metaprogrammiertes Fac<> wird ein guter Compiler wohl auch ausrechnen, wenn's geht...
-
@operator void
bei solchen trivialen Sachen lohnt sich IMHO die Compile-Zeit verlängerung nicht, die durch Template Meta Programmierung teilweise recht enorm sein kann.Da würde ich lieber einen Kommentar im Quellcode einfügen, der angibt warum die 120 da steht.
-
kingruedi schrieb:
Da würde ich lieber einen Kommentar im Quellcode einfügen, der angibt warum die 120 da steht.
exakt!
sinn macht Fact<> nur dann, wenn es Teil einer Library ist, in der Fact<> abhaengig von den angaben des programmierers berechnet werden muss.
-
man brauch ja noch nichtmal nen Kommentar
const int fakultaet_von_5=120 void foo() { bar(fakultaet_von_5); }
ist ja auch recht eindeutig
-
Ob das Starten des Taschenrechners, Ausrechnen des Werts, hinzufügen der Konstante und die tatsächliche Verwendung von dem kleinen Kompilierungsboost mal ausgeglichen werden, hängt dann wohl davon ab, wie oft man seinen Code kompiliert...
-
kingruedi schrieb:
man brauch ja noch nichtmal nen Kommentar
const int fakultaet_von_5=120 void foo() { bar(fakultaet_von_5); }
ist ja auch recht eindeutig
Der war gut.
-
Hallo liebe Experten des Template Meta Programmierung,
wer von euch hat schonmal ein Meta IF für den Windows C++ Compiler (VC++7) geschrieben?
Der Compiler von Windows ist nicht wirklich standartkonform.
Beispielsweise scheint partielle Spezialisierung nur bedingt möglich.