Referenz auf lokale Variable
-
Für mich ist das ein typischer Fall für "output parameter":
Daten& BerechneDaten(const Parameter &test, const float def); // -> void BerechneDaten(const Parameter &test, const float def, Daten& output);
-
Oder einfach ne Kopie zurückgeben ... also Daten anstelle von Daten& ...
-
(D)Evil schrieb:
Oder einfach ne Kopie zurückgeben ... also Daten anstelle von Daten& ...
Wenn der Compiler nur RVO kann aber kein NRVO ist Kopie zurückgeben nicht gut.
Wenn der Compiler NRVO kann... und man aufpasst dass er es auch machen kann...
-
templäd schrieb:
Für mich ist das ein typischer Fall für auto_ptr
Man braucht keine extra Zeile, um die Variable zu deklarieren um sie als Output-Parameter zu übergeben, new innerhalb & delete außerhalb einer Funktion is nix und das Objekt zu kopieren ist unnötig
-
Danke erstmal.
Es geht in erster Linie um eine Vektorklasse und Operatoren, d.h. eine zusätzliche Referenz als Eingabeparameter kommt für mich nicht in Frage.
Naja, dann kopiere ich halt vorerst mal alles.
Danke.
-
Warum nicht auto_ptr?
#include <iostream> #include <memory> using namespace std; struct Daten { int x; Daten() { cout << "Hi" << endl; } ~Daten() { cout << "Bye" << endl; } }; std::auto_ptr<Daten> Do( int i ) { auto_ptr<Daten> ret( new Daten() ); ret->x = i; return ret; } int main() { auto_ptr<Daten> data = Do( 10 ); cout << data->x << endl; return 0; } // Ausgabe: // Hi // 10 // Bye
-
Fräger schrieb:
Danke erstmal.
Es geht in erster Linie um eine Vektorklasse und Operatoren, d.h. eine zusätzliche Referenz als Eingabeparameter kommt für mich nicht in Frage.
Naja, dann kopiere ich halt vorerst mal alles.
Danke.Was spricht dagegen zusätzlich eine Schnittstelle anzubieten welche es erlaubt "in place" zu arbeiten bzw. ein output Parameter zu akzeptieren?
Dann kann man die operatoren verwenden in Fällen wo Geschwindigkeit egal ist, und wenns schnell gehen soll die alternative Schnittstelle.
-
@hustbaer:
Darum meine ich ja auch vorerst.@Badestrand:
Ist die Lösung mut auto_ptr nicht viel Performancelastiger (zumindest bei kleineren Rückgabedatenpaketen)?
-
Fräger schrieb:
@Badestrand:
Ist die Lösung mut auto_ptr nicht viel Performancelastiger (zumindest bei kleineren Rückgabedatenpaketen)?Wenn du nur einen Zeiger auf einen int zurückgibst, vielleicht. Die Rechenzeit, die beim auto_ptr verbraucht wird, ist aber sowas von gering!
-
Fräger schrieb:
@hustbaer:
Darum meine ich ja auch vorerst.aaaaaaaaaaah
Badestrand schrieb:
Die Rechenzeit, die beim auto_ptr verbraucht wird, ist aber sowas von gering!
Wenn man sowieso schon "new" verwenden muss dann ja, dann spielt der auto_ptr keine Rolle mehr. Bloss wenn man durch den blöden auto_ptr gezwungen wird new zu verwenden wo es nicht nötig wäre, dann ist das je nach grösse des zu kopierenden Objektes u.U. hundert- oder sogar tausendmal langsamer.
EDIT: sorry, das klingt jetzt (durch das "den blöden auto_ptr") etwas aggressiv, ist aber nicht so gemeint.