Considerare sottostante Codice:Qual è il modo migliore per inizializzare un contenitore con oggetti che sono a buon mercato per muoversi, ma pesante per copiare
#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();
}
Compilato con g++ -std=c++11 main.cpp && ./a.out
, il risultato è:
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.
Nota che entrambe le funzioni utilizzano la copia elision in modo che lo std::vector<C>
restituito non venga copiato.
Capisco perché h()
utilizza move-constructor
, ma perché g()
utilizza copy-constructor
?
Da vector's doc:
(6) lista di inizializzazione del costruttore
Costrutti un contenitore con una copia di ciascuno degli elementi il, nello stesso ordine.
Sembra di inizializzazione-list sempre copiare gli elementi, allora probabilmente significa prestazioni 's il initializer-list constructor
potrebbe essere influenzato se C
è a buon mercato per muoversi, ma pesante da copiare.
Quindi la mia domanda: qual è il modo preferito per inizializzare un contenitore (ad esempio vector
) con oggetti economici da spostare ma pesanti da copiare?
'std :: vector ritorno (3);'. E trova un modo per rendere 'noexcept' il costruttore di mosse' C'. –
ildjarn
Hai bisogno di fornire argomenti nel tuo codice reale o stai semplicemente usando il costruttore predefinito? – TartanLlama
@ildjarn @TartanLlama Conosco 'std :: vector (3);' evita qualsiasi copia o spostamento, ma se voglio inizializzarmi con oggetti con parametri (non costruttore di default), non posso usare 'std :: vector (3); '. Quindi in tal caso, qual è il modo preferito? –
Mine