Copia mediante cessione pianura è migliore, dal momento che è più corto, più facile da leggere, e ha un alto livello di astrazione. Invece di dire (al lettore umano del codice) "copia questi bit da qui a lì", e chiedendo al lettore di pensare all'argomento delle dimensioni della copia, stai semplicemente facendo un semplice compito ("copia questo valore da qui a qui "). Non ci può essere alcuna esitazione sul fatto che la dimensione sia corretta o meno.
Inoltre, se la struttura è pesantemente riempita, l'assegnazione potrebbe far sì che il compilatore emetta qualcosa di più efficiente, poiché non deve copiare il padding (e sa dove si trova), ma lo mempcy()
non lo farà copia sempre il numero esatto di byte che gli dici di copiare.
Se la stringa è un array effettivo, ad es.:
struct {
char string[32];
size_t len;
} a, b;
strcpy(a.string, "hello");
a.len = strlen(a.string);
Quindi è ancora possibile utilizzare l'assegnazione pianura:
b = a;
Per ottenere una copia completa. Tuttavia, per dati a lunghezza variabile modellati come questo, questo non è il modo più efficiente di eseguire la copia poiché l'intero array verrà sempre copiato.
Attenzione però, che le strutture di copiatura che contengono i puntatori a memoria heap allocata può essere un po 'pericoloso, dal momento che così facendo si è aliasing il puntatore, e in genere rendendolo ambiguo che possiede il puntatore dopo l'operazione di copia .
Per queste situazioni una "copia profonda" è davvero l'unica scelta e deve essere inserita in una funzione.
Perché stai parlando di "funzioni membro" in una domanda contrassegnata come C? – unwind
Puoi mostrarci la struttura o almeno un estratto di esso? Presumo che la stringa non sia un membro _function_, solo un membro visto che stiamo parlando di C qui.La "stringa" è un array di caratteri, un char assegnato dinamicamente o cosa? – rjnilsson