Qual è la differenza tra std::uninitialized_copy
e std::copy
e quando dovrei usare quale?Differenza tra std :: uninitialized_copy e std :: copy?
risposta
Supponiamo di aver allocato un po 'di memoria nello heap tramite malloc
e di avere un puntatore T* p
. Si finisce con l'archiviazione non inizializzata perché tutto il malloc
fa contrassegnare una posizione della dimensione richiesta come allocata (new
d'altra parte effettivamente costruisce oggetti e quindi rende la memoria inizializzata della regione allocata). Dal momento che la posizione di memoria a partire da p
non ha un oggetto valido di tipo T
seduto lì, non si può fare questo
T a;
*p = a;
poiché non v'è oggetto di tipo T
a p
per richiamare l'operatore di assegnamento su. Invece, si avrà un costrutto un oggetto di tipo T
in posizione p
utilizzando placement new
:
T a;
new (p) T{a};
std::uninitialized_copy
implementa semplicemente la versione gamma del frammento di codice di cui sopra quando si tratta di una gamma che si desidera copiare nella memoria non inizializzata .
La tua risposta lo inchioda, cancella il mio, +1. – vsoftco
È 'uninitialized_copy' esattamente equivalente a' memcpy' in effetti? –
@MattMcNabb Questo sarebbe vero solo se sono banalmente copiabili, AFAIK. – Pradhan