Betrachten unten Code zu kopieren:Was die bevorzugte Art und Weise ist es, einen Behälter mit Objekten zu initialisieren, die billig sind zu bewegen, aber schwer
#include <iostream>
#include <vector>
struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
C(C&&) {std::cout << "A move was made.\n";}
};
std::vector<C> g() {
std::vector<C> ret {C(), C(), C()};
return ret;
}
std::vector<C> h() {
std::vector<C> ret;
ret.reserve(3);
ret.push_back(C());
ret.push_back(C());
ret.push_back(C());
return ret;
}
int main() {
std::cout << "Test g\n";
std::vector<C> v1 = g();
std::cout << "Test h\n";
std::vector<C> v2 = h();
}
mit g++ -std=c++11 main.cpp && ./a.out
Zusammengestellt, ist das Ergebnis:
Test g
A copy was made.
A copy was made.
A copy was made.
Test h
A move was made.
A move was made.
A move was made.
Hinweis Beide Funktionen verwenden Kopie Elision, so dass die zurückgegebene nicht kopiert wird.
Ich verstehe, warum h()
verwendet move-constructor
, aber warum g()
copy-constructor
verwendet?
Von vector's doc:
(6) Initialisiererliste Konstruktor
Konstrukten einen Behälter mit einer Kopie von jedem der Elemente in il, in der gleichen Reihenfolge.
Es sieht aus wie Initialisierer-Liste immer die Elemente zu kopieren, dann wohl bedeuten sie die initializer-list constructor
die Leistung beeinträchtigt werden könnte, wenn C
billig zu bewegen, aber schwer zu kopieren.
Also meine Frage: Was ist die bevorzugte Möglichkeit, einen Container (z. B. vector
) mit Objekten zu initialisieren, die billig zu bewegen sind, aber schwer zu kopieren?
'return std :: vector (3);'. Und finde einen Weg, 'C's Konstruktor' noexcept' zu bewegen. –
ildjarn
Müssen Sie in Ihrem echten Code Argumente angeben oder verwenden Sie einfach den Standardkonstruktor? – TartanLlama
@ildjarn @TartanLlama Ich weiß 'std :: vector (3);' vermeiden Sie jede Kopie oder Bewegung, aber wenn ich mit Objekten mit Parametern (nicht Standardkonstruktor) initialisieren möchte, kann ich 'std :: vector nicht verwenden (3);. Also, in diesem Fall, was ist der bevorzugte Weg? –
Mine