Struct von einer Funktion zurückgeben
-
Hallo,
ich habe hier mehrere Funktionen, die jeweils Daten in Form einer Struct zurückgeben.
Vector operator +(const Vector &v1, const Vector &v2) { return Vector(v1.x + v2.x, v1.y+v2.y, v1.z+v2.z); }Soweit ich weiß wird beim Zurückgeben aber eine Kopie meiner Struct zurückgegeben?
Gibt es eine Möglichkeit das zu vermeiden? Ist es sinnvoll, die Funktion als inline zu deklarieren, oder macht es keinen unterschied, wenn ich sie seperat in einer cpp-Datei implementiere? Oder wird das alles bereits vom Compiler optimiert?
-
Mach die Funktion inline und dann kann der Compiler die Kopie problemlos weglassen (Return value optimization, RVO).
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Unregistriert schrieb:
ich habe hier mehrere Funktionen, die jeweils Daten in Form einer Struct zurückgeben.
Vector operator +(const Vector &v1, const Vector &v2) { return Vector(v1.x + v2.x, v1.y+v2.y, v1.z+v2.z); }Soweit ich weiß wird beim Zurückgeben aber eine Kopie meiner Struct zurückgegeben?
Es wird ein Vector-Objekt zurück gegeben. Dieses Vector-Objekt wird typischerweise direkt erzeugt (RVO = return value optimization).
Unregistriert schrieb:
Gibt es eine Möglichkeit das zu vermeiden?
Da gibt es nicht viel zu vermeiden.
Unregistriert schrieb:
Ist es sinnvoll, die Funktion als inline zu deklarieren, oder macht es keinen unterschied, wenn ich sie seperat in einer cpp-Datei implementiere?
Das macht keinen Unterschied. RVO ist so oder so anwendbar.
Unregistriert schrieb:
Oder wird das alles bereits vom Compiler optimiert?
Ich wüsste jedenfalls nicht, was da in deinem Fall noch übrig bleiben sollte, wo du per "Handanlegen" noch etwas rausholen kannst.
-
Unregistriert schrieb:
Ist es sinnvoll, die Funktion als inline zu deklarieren
Ja, aber warum ist
Vectorkein Template?Unregistriert schrieb:
der macht es keinen unterschied, wenn ich sie seperat in einer cpp-Datei implementiere? Oder wird das alles bereits vom Compiler optimiert?
Inlinen geht nur, wenn die Definition im Header steht.
-
Danke,
mir ging es hauptsächlich darum zu wissen, ob es einen Unterschied macht, wenn ich eine Funktion im Header als inline implementiere, oder seperat in der cpp, und in der .h nur den Header der Funktion habe. Das scheint ja keinen Unterschied zu machen, wenn ich es recht verstanden habe.
Der Vektor ist nur ein Beispiel gewesen, betrifft für mich auch andere Funktionen (wo auch mehr als nur 3 floats in der Struct stehen). Der Vektor ist bei mir kein Template, weil ich auch keinen großen Sinn darin sehe (zumindest für meinen Fall). Ich schreib keine riesengroße Library, die für hunderte verschiedener Programme verwendet wird, von daher macht es für mich keinen Unterschied, ob ich
template <typename T> struct TVector { T x, y, z; }; typedef TVector<float> Vector;oder direkt
struct Vector { float x, y, z; };schreibe. Letzteres ist für mich schlichtweg einfacher zu handhaben.