web-dev-qa-db-fra.com

Affectation de structure ou memcpy?

Si je veux reproduire une structure dans une autre (en C), quels sont les avantages et les inconvénients de:

struct1 = struct2;

contre

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

Sont-ils équivalents? Y a-t-il une différence de performances ou d'utilisation de la mémoire?

36
ofaurax

Le struct1=struct2; la notation est non seulement plus concise, mais également plus courte et laisse plus d'opportunités d'optimisation au compilateur. La signification sémantique de = est une affectation, tandis que memcpy copie simplement la mémoire. C'est également une énorme différence de lisibilité, bien que memcpy fasse de même dans ce cas.

Utilisation =.

34
Alexander Gessler

Découvrez cette conversation sur le même sujet: http://bytes.com/topic/c/answers/670947-struct-assignment

Fondamentalement, il y a beaucoup de désaccords sur les cas d'angle dans ce fil sur ce que ferait la copie de structure. Il est assez clair si tous les membres d'une structure sont des valeurs simples (int, double, etc.). La confusion vient de ce qui se passe avec les tableaux et les pointeurs et les octets de remplissage.

Tout devrait être assez clair sur ce qui se passe avec le memcpy, car il s'agit d'une copie textuelle de chaque octet. Cela inclut à la fois les pointeurs de mémoire absolue, les décalages relatifs, etc.

4
Berin Loritsch

Je ne suis pas sûr de la différence de performances, même si je suppose que la plupart des compilateurs utiliseraient memcpy sous le capot.

Je préférerais la cession dans la plupart des cas, elle est beaucoup plus facile à lire et est beaucoup plus explicite quant à la finalité. Imaginez que vous avez changé le type de l'une des structures, le compilateur vous guiderait vers les modifications nécessaires, soit en donnant une erreur de compilation soit en utilisant un opérateur = (s'il en existe un). Alors que le second ferait aveuglément la copie avec la possibilité de provoquer un bug subtil.

2
Andy Lowry

Il n'y a aucune raison inhérente pour laquelle l'une serait meilleure en performance que l'autre. Différents compilateurs et leurs versions peuvent différer, donc si vous vous souciez vraiment, vous profilez et comparez et utilisez des faits comme base pour décider.

Une tâche simple est plus claire à lire.

L'affectation est un peu plus risquée pour se tromper, de sorte que vous affectez des pointeurs aux structures plutôt qu'aux structures pointées. Si vous le craignez, vous vous assurerez que vos tests unitaires le couvrent. Je ne me soucierais pas de ce risque. (De même, memcpy est risqué car vous risquez de vous tromper de taille de structure.)

2
user25148