Frage zu Parameterliste
-
klasse foo(klasse &k) { return( //f k.f*sqrt(k.g*k.f+3.5F)*sqrt(k.g+)/(kg.sqrt*(2.F)), //g k.g*sqrt(f+g)/f+=f*sqrt(f); //FEHLER! }
-
Es wird eine Klasse (die nichts mit der eigentlichen berechnung zu tun hat sondern nur variablen speichert und über konstruktor übernimmt) definiert
es gibt eine funktion, die eine referenz auf ein objekt der obigen klassen erwartet und ein objekt der klasse zurückgibt, beschleunigt werden soll und deshalb nicht erst ein objekt erzeugt und dann die einzelnen werte berechnet, sondern im parameter von return wird ein neues objekt erzeugt und die werte im konstruktor berechnet
Wie kann ich hier beim aufruf des konstruktors den nächsten parameter berechnen, der aber vom vorhergehenden parameter abhängt, ohne doppelt zu berechnenbsp
return( CEineKlasseMitKonstruktor( //Das ist eine Klasse deren Konstruktor 2 floats übernimmt die berechnet werden sollen fParameterFuerKonstruktor1*2, //Die komplizierte langdauernde Berechnung fParameterFuerKonstruktor2 *... //Hier soll der 2. Parameter berechnet werden, der mit dem 1. Parameter zb addiert werden soll //ohne dass ich parameter1 zweimal berechnet wird (1x bei Parameter1 und dann bei parameter2 mehrmals)im Prinzip muss ich irgendwie im Konstruktorparameter auf die Member (die schon früher in der parameteliste berechnet wurden) der neuen klasse in der parameterliste zugreifen können
Konkret gehts mir dabei um die Funktion zu beschleunigen die eine Matrix invertiert (Funktion von David Scherfgen (Autor von "3D-Spieleprogrammierung mit C++ und DirectX"))
Da wird jede komponente der matrix einzeln berechnet und die letzten 4 hängen von den ersten ab. Die genaue Funktion kann ich wegen urheberrechtlichen blablabla nicht preisgeben
-
Sorry, aber deine Beispiele sind voller Syntaxfehler. Da findet kein Mensch durch (und du anscheinend selber noch nicht einmal)!
Wenn du einen Ausdruck nicht doppelt berechnen willst, dann speicherst du diesen halt in eine lokale Variable.
-
Wenn ich das mit der lokalen Variable mache hab ich den gleichen effekt wie wenn ich die funktion so lasse und in der funktion, des zurückzugebenden objektes jedes member einzeln berechne
ich will ja die konstruktorparameter berechnen während er aufgerufen wird
aber dabei muss ich zur berechnung auf die member zugreifen können, die schon als parameter übergeben wurden, denn ich brauche für die letzten berechnungen alle vorhergehenden also lohnt es sich nicht mit lokalen variablengibts da eine möglichkeit?
-
int a = wahnsinnigteureberechnung(); int b = nochvielteurerefunc(a); Foo f(a, b);was ist daran nicht praktikabel?
-
Das hat am ende den gleichen Effekt als wenn ich die member einzeln berechne
Ich geb's auf 
-
du hast da nen eklatantes verständnisproblem

-
Das macht dein Compiler meist automatisch für dich.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Optimize#Answ
-
naja, ums zu beschleunigen, fällt mir höchstens ne numerische berechnung der wurzel ein, weiß nicht genau, wie sqrt die wurzel berechnet, aber die numerische berechnung lohnt sich meistens nur, wenn man in ner schleife häufiger sqrt verwenden würde und sich dann lieber die größe iterativ besorgt
-
zu 99,9999999999999% wird hier an der falschen stelle optimiert.
-
abc123 schrieb:
und jetzt diese funktion
klasse foo(klasse &k) { klasse ret; ret.f=k.f*sqrt(k.g*k.f+3.5F)*sqrt(k.g+)/(kg.sqrt*(2.F)); ret.g=k.g*sqrt(ret.f+ret.f)/ret.f+ret.f*sqrt(ret.f); return(ret); }Und diese Formel geht ohne Murren durch den Compiler? Die Berechnung von ret.f ist ja ein einziger Syntax-Fehler.
Ansonsten: Bevor du von Hand optimierst, solltest du erstmal feststellen, ob diese Funktion überhaupt der Engpass ist. Wenn ja, ist es vielleicht einfacher/sinnvoller, den umliegenden Algorithmus auseinanderzunehmen - so daß sie etwas seltener aufgerufen wird.