Brainsmith hat geschrieben:Danke schonmal für deine schnelle Antwort. Das hat mir auf jeden Fall schonmal sehr geholfen.
Ich benutze Code::Blocks.. daher gehe ich mal davon aus, dass ich wohl eher auf die Pointer-Methode zurückgreifen werde.
Hier geht's erstmal nicht um Tempo, sondern um Code-Stil. Da ist die Pointermethode meiner Meinung nach nicht zu vertreten :-) Und wenn, dann nimm wenigstens const references und keine Zeiger.
Nebenbei: Code:Blocks benutzt den GCC. Und dessen Optimierer ist praktisch genausogut oder sogar besser als der von Visual C++. Es kann gut sein, dass auch der GCC die unnötige Zuweisung im Beispiel "c = a + b" komplett entfernen kann.
Jetzt müsste ich nurnoch wissen, wann man inline-Befehle benutzt und wann nicht. Also eher eine generelle Frage.
Und viel wichtiger ist: Was ist denn der genaue Unterschied?
Das dachte ich, hätte ich schon beschrieben: Ich benutze die klassen-externen Funktionen (sogenannte "freie Operatoren") immer da, wo die Operation die Parameter nicht verändert. Das ist aber nur Stilfrage, der vom Compiler erzeugte Code ist in beiden Fällen exakt derselbe. Du hast also die Wahl:
Code: Alles auswählen
class Vektor
{
float x, y, z;
const Vektor& operator += (const Vektor& v) { x += v.x; y += v.y; z += v.z; }
Vektor operator + (const Vektor& derAndereVektor) const { return Vektor( x + derAndereVektor.x, y + derAndereVektor.y, z + derAndereVektor.z); }
};
oder halt
Code: Alles auswählen
class Vektor
{
float x, y, z;
};
inline const Vektor& operator += (Vektor& ziel, const Vektor& quelle) { ziel.x += quelle.x; ziel.y += quelle.y; ziel.z += quelle.z; }
inline Vektor operator + (const Vektor& a, const Vektor& b) { return Vektor( a.x + b.x, a.y + b.y, a.z + b.z); }
Beide Varianten produzieren den selben Code und sind identisch zu benutzen. Es ist wirklich nur eine Stilfrage. Ich persönlich verpacke die Operatoren mit Zuweisung (wie hier im Beispiel das +=) in die Klasse, weil sie das Objekt verändern. Die symmetrischen Operatoren (wie hier + im Beispiel) formuliere ich dagegen meist als freie Operatoren.
Thema inline: das besagt nur, dass der Compiler nach Möglichkeit direkt den Code der Funktion vor Ort einfügen soll, anstatt einen Sprung zur Funktion einzubauen. Damit spart man sich den Overhead für die Parameterübergabe und sowas... mehr aber auch nicht. Das hat nur bei sehr kleinen Funktionen wirklich drastischen Nutzen, bei größeren Funktionen überwiegt der Aufwand für die eigentliche Ausführung der Funktion bei weitem. Gleichzeitig wird aber mit jedem Inline-Aufruf der Code etwas größer, weswegen man durch schlechtere Cache-Ausnutzung und sowas mit inlines sogar langsamer sein kann als ohne. Daher überlässt man die Entscheidung besser dem Compiler, das "inline" ist für den nur ein Hinweis, aber nicht bindend.
Bye, Thomas