c struct variable-assignment memcpy

memcpy c++



¿Asignación de estructura o memcpy? (4)

Esta pregunta ya tiene una respuesta aquí:

Si quiero replicar una estructura en otra (en C), ¿cuáles son los beneficios de:

struct1 = struct2;

vs

memcpy(&struct1, &struct2, sizeof(mystruct_t));

¿Son equivalentes? ¿Hay alguna diferencia en el rendimiento o el uso de la memoria?


El struct1=struct2; la notación no solo es más concisa, sino también más corta y deja más oportunidades de optimización para el compilador. El significado semántico de = es una asignación, mientras que memcpy simplemente copia la memoria. Esa es una gran diferencia en la legibilidad también, aunque memcpy hace lo mismo en este caso.

Use = .


No estoy seguro de la diferencia de rendimiento, aunque creo que la mayoría de los compiladores usarían memcpy bajo el capó.

Preferiría la tarea en la mayoría de los casos, es mucho más fácil de leer y es mucho más explícita en cuanto a cuál es el propósito. Imagínese que cambió el tipo de cualquiera de las estructuras, el compilador lo guiaría a los cambios necesarios, ya sea al dar un error de compilación o al usar un operador = (si existe). Mientras que el segundo haría ciegamente la copia con la posibilidad de causar un error sutil.


No hay una razón inherente por la que uno sea mejor en rendimiento que el otro. Diferentes compiladores y versiones de ellos pueden diferir, por lo que si realmente te importa, perfila y compara y usa los hechos como base para decidir.

Una tarea directa es más clara de leer.

La asignación es un poco más arriesgada al equivocarse, por lo que se asignan punteros a las estructuras en lugar de a las estructuras apuntadas. Si teme esto, se asegurará de que las pruebas de su unidad lo cubran. No me importaría este riesgo. (De manera similar, memcpy es arriesgado porque es posible que el tamaño de la estructura sea incorrecto).


Vea esta conversación sobre el mismo tema: http://bytes.com/topic/c/answers/670947-struct-assignment

Básicamente, hay muchos desacuerdos sobre los casos de esquina en ese hilo sobre lo que haría la copia de estructura. Está bastante claro si todos los miembros de una estructura son valores simples (int, doble, etc.). La confusión viene con lo que sucede con las matrices y los punteros, y los bytes de relleno.

Todo debería ser bastante claro en cuanto a lo que sucede con memcpy , ya que es una copia literal de cada byte. Esto incluye punteros de memoria absoluta, desplazamientos relativos, etc.