Mettila in questo modo:
supponi di avere una funzione che RITORNA un ""std::vector"" contenente 1.000.000 di elementi, ed uno statement del tipo:
extern std::vector<Debiti> debitiDi(const std::string& who)
std::vector<Debiti> debiti = debitiDi("Paperino");
il comportamento standard dovrebbe essere:
1) viene popolato il vettore usato dalla funzione come valore di ritorno
2) viene vuotato "debiti"
3) viene COLONATO il contenuto del risultato della funzione e messo in "debiti"
4) viene BUTTATO VIA il vettore ritornato dalla funzione.
in 1) hai allocato un vettore per UN MILIONE di elementi
in 3) ti serve spazio per allocare un'ALTRO MILIONE di elementi e anche il TEMPO necessario per fare la copia
in 4) BUTTI VIA il primo vettore, rilasciando la memoria allocata allo heap (operazione che richiede tempo)
con lo ""spostamento""
1) rimane lo stesso
2) anche
3) SPOSTI il contenuto del vettore ritornato dalla funzione DIRETTAMENTE in "debiti". QUINDI non ti serve allocare altra memoria e, di conseguenza, non perdi tempo
4) rimane lo stesso MA in questo caso butti via un vettore VUOTO.
Ovviamente, nell'operazione di SPOSTAMENTO devi mantenere la coerenza su DUE oggetto: l'oggetto sorgente E l'oggetto destinazione.