¿Se puede asignar una instancia de una estructura a otra, así:
struct Test t1;
struct Test t2;
t2 = t1;
Lo he visto funcionar para estructuras simples, pero ¿funciona para estructuras complejas?
¿Cómo sabe el compilador cómo copiar elementos de datos dependiendo de su tipo, es decir, diferenciando entre una int
y una cadena?
Sí, la asignación es compatible con estructuras. Sin embargo, hay problemas:
Ahora los punteros de ambas estructuras apuntan al mismo bloque de memoria: el compilador no copia los datos apuntados. Ahora es difícil saber qué instancia de estructura posee los datos. Esta es la razón por la cual C ++ inventó el concepto de operadores de asignación definibles por el usuario: puede escribir código específico para manejar este caso.
fuente
struct
mismo se copian claramente.Primero mira este ejemplo:
El código C para un programa C simple se proporciona a continuación.
El código ASM equivalente para foo_assign () es
Como puede ver que una asignación simplemente se reemplaza por una instrucción "mov" en el ensamblaje, el operador de asignación simplemente significa mover datos de una ubicación de memoria a otra ubicación de memoria. La asignación solo lo hará para miembros inmediatos de una estructura y no se copiará cuando tenga tipos de datos complejos en una estructura. Aquí COMPLEJO significa que no puede tener una variedad de punteros, apuntando a listas.
Una matriz de caracteres dentro de una estructura no funcionará en la mayoría de los compiladores, esto se debe a que la asignación simplemente intentará copiar sin siquiera considerar que el tipo de datos es de tipo complejo.
fuente
Esta es una copia simple, tal como lo haría con
memcpy()
(de hecho, algunos compiladores en realidad producen una llamadamemcpy()
para ese código). No hay "cadena" en C, solo apunta a un grupo de caracteres. Si su estructura de origen contiene dicho puntero, entonces el puntero se copia, no los caracteres en sí.fuente
memcpy
, vea aquí: godbolt.org/z/nPxqWc - Pero ahora si paso punteros idénticosa
yb
, y*a = *b
se traduce a unmemcpy
comportamiento indefinido, porquememcpy
"Las áreas de memoria no deben superponerse". (citando la página del manual). Entonces, ¿el compilador está equivocado al usarmemcpy
o estoy equivocado al escribir tal asignación?¿Quiso decir "complejo" como en número complejo con partes reales e imaginarias? Esto parece poco probable, por lo que si no, tendría que dar un ejemplo ya que "complejo" no significa nada específico en términos del lenguaje C.
Obtendrá una copia de memoria directa de la estructura; si eso es lo que quieres depende de la estructura. Por ejemplo, si la estructura contiene un puntero, ambas copias apuntarán a los mismos datos. Esto puede o no ser lo que quieres; eso depende del diseño de su programa.
Para realizar una copia 'inteligente' (o una copia 'profunda'), deberá implementar una función para realizar la copia. Esto puede ser muy difícil de lograr si la estructura en sí contiene punteros y estructuras que también contienen punteros, y quizás punteros a tales estructuras (quizás eso es lo que quiere decir con "complejo"), y es difícil de mantener. La solución simple es usar C ++ e implementar constructores de copia y operadores de asignación para cada estructura o clase, luego cada uno se hace responsable de su propia semántica de copia, puede usar la sintaxis de asignación y se mantiene más fácilmente.
fuente