La copie par affectation simple est la meilleure, car elle est plus courte, plus facile à lire et présente un niveau d'abstraction plus élevé. Au lieu de dire (au lecteur humain du code) "copier ces bits de ici à là", et de demander au lecteur de réfléchir à l'argument de la taille de la copie, vous faites simplement une simple affectation ("copier cette valeur de ici à là"). Il ne peut pas y avoir d'hésitation sur le fait que la taille soit correcte ou non.
De plus, si la structure est fortement paddée, l'affectation pourrait faire en sorte que le compilateur émette quelque chose de plus efficace, puisqu'il n'a pas à copier le padding (et qu'il sait où il se trouve), mais mempcy()
ne le fait pas, donc il copiera toujours le nombre exact d'octets que vous lui demandez de copier.
Si votre chaîne est un tableau réel, c'est-à-dire :
struct {
char string[32];
size_t len;
} a, b;
strcpy(a.string, "hello");
a.len = strlen(a.string);
Dans ce cas, vous pouvez toujours utiliser l'affectation ordinaire :
b = a;
Pour obtenir une copie complète. Cependant, pour les données de longueur variable modélisées de la sorte, ce n'est pas la manière la plus efficace d'effectuer la copie puisque le tableau entier sera toujours copié.
Attention cependant, copier des structures qui contiennent des pointeurs vers de la mémoire allouée au tas peut être un peu dangereux, car en faisant cela vous êtes crénelage le pointeur, ce qui rend généralement ambigu le propriétaire du pointeur après l'opération de copie.
Dans ce cas, la seule solution consiste à effectuer une "copie profonde", qui doit être placée dans une fonction.
4 votes
Pourquoi parlez-vous de "fonctions membres" dans une question étiquetée "C" ?
2 votes
Pourriez-vous nous montrer la structure ou du moins un extrait de celle-ci ? Je suppose que la chaîne n'est pas un membre fonction seulement un membre, car nous parlons d'un simple C ici. La "chaîne" est-elle un tableau de chars, un char* alloué dynamiquement ou quoi ?