Diese Frage wurde durch Verwirrung über RVO in C++ 11 ausgelöst.Welche "Return" -Methode ist besser für große Daten in C++/C++ 11?
Ich habe zwei Möglichkeiten, um "Return" value: Rückkehr nach Wert und Rückkehr über Referenzparameter. Wenn ich nicht betrachte die Leistung, bevorzuge ich die erste. Da die Rückgabe von Wert ist natürlicher und ich kann leicht die Eingabe und die Ausgabe unterscheiden. Aber, wenn ich die Effizienz bei der Rückgabe großer Daten betrachte. Ich kann mich nicht entscheiden, denn in C++ 11 gibt es RVO.
Hier mein Beispiel-Code, sind diese beiden Codes die gleiche Arbeit:
Rückkehr nach Wert
struct SolutionType
{
vector<double> X;
vector<double> Y;
SolutionType(int N) : X(N),Y(N) { }
};
SolutionType firstReturnMethod(const double input1,
const double input2);
{
// Some work is here
SolutionType tmp_solution(N);
// since the name is too long, I make alias.
vector<double> &x = tmp_solution.X;
vector<double> &y = tmp_solution.Y;
for (...)
{
// some operation about x and y
// after that these two vectors become very large
}
return tmp_solution;
}
Rückkehr über Referenzparameter
void secondReturnMethod(SolutionType& solution,
const double input1,
const double input2);
{
// Some work is here
// since the name is too long, I make alias.
vector<double> &x = solution.X;
vector<double> &y = solution.Y;
for (...)
{
// some operation about x and y
// after that these two vectors become very large
}
}
Hier sind meine Fragen:
- Wie kann ich sicherstellen, dass RVO in C++ 11 passiert ist?
- Wenn wir sicher sind, dass RVO passiert ist, in der heutigen C++ - Programmierung, welche "Return" -Methode empfehlen Sie ? Warum?
- Warum gibt es eine Bibliothek, die die Rückgabe über Referenzparameter, Codestil oder historischen Grund verwendet?
UPDATE Dank dieser Antworten, ich weiß, die erste Methode in den meisten Art und Weise besser ist.
Hier einige nützlichen Links zum Thema, die mir dieses Problem verstehen helfen:
- How to return large data efficiently in C++11
- In C++, is it still bad practice to return a vector from a function?
- Want Speed? Pass by Value.
Wird es auch dann, wenn in 'return x verschoben werden;' 'x' ist ein L-Wert und' std :: move' fehlt? – Zereges
Kein großer Fan von * viertem *, wie? – IInspectable
@Zereges Niemals mit 'return std :: move (something) zurückkehren;' Es ist eine Pessimierung. – NathanOliver