2011-03-21 20 views
32

Si quiero replicar una estructura en la otra (en C), ¿cuáles son los pros los contras de &:Struct assignment or memcpy?

struct1 = struct2; 

vs

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

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

+3

Solo tenga cuidado con la asignación de memoria dentro de la estructura. Por ejemplo, si tiene una estructura que contiene un puntero a una cadena y asigna memoria para la cadena. Ese recuerdo no se copia. el puntero a la memoria se copia, pero no la memoria en sí misma. En otras palabras, este tipo de asignación no es una copia profunda. Tampoco es memcpy vainilla para esa materia. Puede ser confuso en cuanto a quién posee la memoria asignada. – Pemdas

+0

Creo que esta pregunta es más adecuada para Stackoverflow. – karlphillip

+2

Creo que esta pregunta ya fue bien respondida aquí: http://stackoverflow.com/q/4931123/176769 – karlphillip

Respuesta

31

La notación struct1=struct2; 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 solo copia la memoria. Esa es una gran diferencia en la legibilidad también, aunque memcpy hace lo mismo en este caso.

Use =.

+0

Problema principal en s = mystruct entre struct s y struct * s. Ambos funcionan muy bien con iguales, por lo que no puedes ver la diferencia leyendo. * s te da idéntica, mientras que struct s te da una copia. Cuando llega el momento de desasignar (s), esto funciona bien con las struct * s idénticas; pero se pierde misterio si tontamente haces solo un trato con la versión de la estructura. También es más rápido trabajar con punteros. Solo mantén lo que estás haciendo en mente, y entonces las cosas deberían estar bien. YMMV. – DragonLord

2

No estoy seguro de la diferencia de rendimiento, aunque supongo que la mayoría de los compiladores usarían memcpy debajo del 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.

2

No hay ninguna 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 asignación 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 las estructuras apuntadas. Si teme esto, se asegurará de que las pruebas de su unidad lo cubran. No me importaría este riesgo. (Del mismo modo, memcpy es arriesgada, ya que podría obtener el tamaño estructura equivocada.)

+0

No hay nada arriesgado sobre 'memcpy' si usas' sizeof' y la estructura correcta. Supongo que podrías equivocar la estructura y no habría ningún error.Creo que probablemente tendrías una falla de segmentación finalmente. –

4

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

Básicamente, hay una gran cantidad de desacuerdos sobre los casos de esquina en ese hilo en lo que haría la copia struct. 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 el memcpy, ya que es una copia literal de cada byte. Esto incluye punteros de memoria absoluta, desplazamientos relativos, etc.