Originariamente inviato da giuseppe500
che beneficio ne traggo oltre al risparmio di memoria?
Ti risparmi un sacco di copie inutili.
Considera questo esempio:
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();
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.

Move semantics.
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();
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.
Domanda: quale delle due soluzioni è preferibile?