Sie sollten nach Wert zurückkehren.
Der Standard verfügt über eine spezielle Funktion zur Verbesserung der Effizienz der Wertrendite. Es heißt "Copy Elision" und in diesem Fall "Named Return Value Optimization (NRVO)".
Compiler müssen es nicht implementieren, aber dann wieder Compiler nicht haben Funktion zu implementieren inlining (oder jede Optimierung überhaupt durchführen). Die Leistung der Standardbibliotheken kann jedoch ziemlich schlecht sein, wenn Compiler nicht optimieren und alle seriösen Compiler Inlining und NRVO (und andere Optimierungen) implementieren.
Wenn NRVO angewendet wird, wird der folgende Code nicht kopiert:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
Der Benutzer möchte dies jedoch möglicherweise tun:
std::vector<int> myvec;
... some time later ...
myvec = f();
Die Kopierelision verhindert hier keine Kopie, da es sich eher um eine Zuweisung als um eine Initialisierung handelt. Sie sollten jedoch weiterhin nach Wert zurückkehren. In C ++ 11 wird die Zuweisung durch etwas anderes optimiert, das als "Verschiebungssemantik" bezeichnet wird. In C ++ 03 verursacht der obige Code eine Kopie, und obwohl theoretisch ein Optimierer dies möglicherweise vermeiden kann, ist es in der Praxis zu schwierig. myvec = f()
In C ++ 03 sollten Sie stattdessen Folgendes schreiben:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
Es gibt eine weitere Option, die dem Benutzer eine flexiblere Benutzeroberfläche bietet:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
Darüber hinaus können Sie die vorhandene vektorbasierte Schnittstelle unterstützen:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
Dies ist möglicherweise weniger effizient als Ihr vorhandener Code, wenn Ihr vorhandener Code reserve()
komplexer ist als nur ein fester Betrag im Voraus. Wenn Ihr vorhandener Code push_back
den Vektor jedoch grundsätzlich wiederholt aufruft , sollte dieser vorlagenbasierte Code genauso gut sein.
f
?