Wenn ich auto_ptr als Rückgabewert einer Funktion, die große Vektoren auffüllt, verwendet, macht dies die Funktion eine Quelle Funktion (es wird eine interne Auto_ptr erstellen und Übergabe übergeben, wenn es ein Non zurückgibt) const auto_ptr). Ich kann diese Funktion jedoch nicht mit STL-Algorithmen verwenden, da ich für den Zugriff auf die Daten auto_ptr ignorieren muss. Ein gutes Beispiel wäre ein Feld von Vektoren der Größe N, wobei jeder Vektor 100 Komponenten hat. Ob die Funktion jeden 100-Komponenten-Vektor nach Wert oder ref zurückgibt, ist nicht der gleiche, wenn N groß ist.Rückgabewertoptimierung vs auto_ptr für große Vektoren
Auch wenn ich diesen sehr grundlegenden Code versuchen:
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
beide autoFun und Spaß Anrufe führen mit dem Ausgang
Ctor Dtor
so kann ich nicht wirklich die automatische Variable sehen, welche wird erstellt, um an die return-Anweisung weitergegeben zu werden. Bedeutet dies, dass die Rückgabewert-Optimierung für den Aufruf wertFunktion gesetzt ist? Erzeugt ValueFun in diesem Fall überhaupt zwei automatische Objekte?
Wie optimiere ich dann eine Population von solch einer großen Datenstruktur mit einer Funktion?
Fragen Sie, ob RVO auch für Ihre großen Vektoren funktioniert? Wenn ja, kannst du es nicht einfach mit einem Beispiel wie oben testen? – juanchopanza
Wenn ich es teste, heißt das, dass es für alle Compiler/Plattformen funktioniert? Woher weiß ich, dass RVO überhaupt enthalten ist, sollte ich die Compiler-Spezifikationen lesen? Was passiert, wenn der Code in einem HPC-Cluster mit einem anderen Compiler kompiliert wird und die Bibliothek groß ist? – tmaric
Ja, ich verstehe deinen Standpunkt. Es ist eines dieser Dinge, die der Compiler erlaubt, aber nicht benötigt, so dass Sie nie sicher sein können. BTW haben Sie C++ 11 Unterstützung? – juanchopanza