Ti risparmi un sacco di copie inutili.Originariamente inviato da giuseppe500
che beneficio ne traggo oltre al risparmio di memoria?
Considera questo esempio:
Per avere my_vector il compilatore crea sullo stack una variabile temporanea di temp (con tanto di allocazione di 4MB e relativa copia di elementi), distrugga temp, crei my_vector (allocando altri 4MB di memoria), copi gli elementi dalla variabile temporanea a my_vector e distrugga la variabile temporanea.codice:std::vector<std::string> get_big_vector() { std::vector<std::string> temp; temp.resize(4000 * 1024); // 4MB /* varie operazioni sul vector */ return temp; } std::vector<std::string> my_vector = get_big_vector();
Move semantics.
Qui per avere my_vector il compilatore crea una variabile temporanea sullo stack, ruba il puntatore e i dati interni a temp lasciandola in uno stato stabile, distrugge temp, crea my_vector rubando il puntatore e i dati interni alla variabile temporanea lasciandola in uno stato stabile. Al netto di ottimizzazioni da parte del compilatore ti risparmi due allocazioni e due copie inutili.codice:std::vector<std::string> get_big_vector() { std::vector<std::string> temp; temp.resize(4000 * 1024); // 4MB /* varie operazioni sul vector */ return std::move(temp); } std::vector<std::string> my_vector = get_big_vector();
Domanda: quale delle due soluzioni è preferibile?