copia por cesión llanura que es mejor, ya que es más corto, más fácil de leer, y tiene un nivel más alto de abstracción. En lugar de decir (al lector humano del código) "copie estos bits de aquí para allá" y requiera que el lector piense en el argumento del tamaño de la copia, simplemente está haciendo una asignación simple ("copie este valor de aquí hasta aquí "). No puede haber dudas sobre si el tamaño es correcto o no.
Además, si la estructura está muy acolchada, la asignación puede hacer que el compilador emita algo más eficiente, ya que no tiene que copiar el relleno (y sabe dónde está), pero mempcy()
no lo hace. siempre copie el número exacto de bytes que le dice que copie.
Si su cadena es una matriz real, es decir:
struct {
char string[32];
size_t len;
} a, b;
strcpy(a.string, "hello");
a.len = strlen(a.string);
entonces todavía puede usar la asignación clara:
b = a;
Para obtener una copia completa. Sin embargo, para los datos de longitud variable modelados así, esta no es la forma más eficiente de hacer la copia ya que toda la matriz siempre se copiará.
Tenga cuidado sin embargo, que las estructuras de copiado que contienen punteros a la pila de memoria asignada puede ser un poco peligroso, ya que al hacerlo estás aliasing el puntero, y por lo general lo que es ambiguo que posee el puntero después de la operación de copia .
Para estas situaciones, una "copia profunda" es realmente la única opción, y eso debe ir en una función.
¿Por qué estás hablando de "funciones de miembro" en una pregunta etiquetada como C? – unwind
¿Podría mostrarnos la estructura o al menos un extracto de ella? Supongo que la cadena no es una "función" de miembro, solo un miembro ya que estamos hablando de C simple aquí.¿Es la "cadena" una matriz de caracteres, un carácter * asignado dinámicamente o qué? – rjnilsson