Affectation automatique ou memcpy ?

Le
Sylvère
Salut,

tout d'abord j'aimerais être rassuré : Ces 2 ligne de code (1) et (2)
font bien la meme chose ?

maStructure *structure;
void* buffer;

(1) memcpy (structure,buffer,sizeof(maStructure));
(2) structure=*((maStructure*)buffer);



si s'est bien le cas voici ma question , qu'est-ce que vous utilisez
d'habitude ?
J'ai regardé le code assembleur généré et ca donne:
-Evidemment un appelle de fonction pour (1)
-Alors que pour (2) le compilateur génère directement le code pour la copie
( ça aussi je m'y attendais)

Bon , la question c'est quand même laquel de ces formes choisir , une des
formes est déconseillée ou ca depend du contexte ?

Sylvère , qui se pose peut etre trop de questions parfois ;-)
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Serge Paccalin
Le #583358
Le vendredi 5 mars 2004 à 21:32:47, Sylvère a écrit dans
fr.comp.lang.c :

tout d'abord j'aimerais être rassuré : Ces 2 ligne de code (1) et (2)
font bien la meme chose ?


Absolument pas.

maStructure *structure;


structure contient un pointeur (une « adresse ») vers un objet de type
maStructure ; du moins, ce sera le cas quand elle sera initialisée...

void* buffer;


buffer contient un pointeur (une « adresse ») vers un objet de type
indéterminé ; là encore, ce sera le cas quand elle sera initialisée...

(1) memcpy (structure,buffer,sizeof(maStructure));


recopie un certain nombre de bytes de l'adresse contenue dans buffer
vers l'adresse contenue dans structure, ce nombre étant la taille d'un
objet de type maStructure. Il faut que structure et buffer soiet
initialisées toutes les deux avant de faire ça.

(2) structure=*((maStructure*)buffer);


ne marche pas. Tu essaies de copier un objet de type maStructure dans
une adresse.

(3) structure = (maStructure *)buffer;

copie dans structure l'adresse contenue dans buffer, après avoir indiqué
(inutilement, en C) qu'il fallait la considérer comme une adresse vers
un objet de type maStructure. structure et buffer pointent désormais
vers le même objet. Il faut que buffer soit initialisée avant de faire
ça, et que structure ne pointe pas vers un objet alloué dynamiquement
(sinon, c'est une fuite mémoire).


--
___________ 2004-03-05 21:49:49
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Sylvère
Le #583108
Il faut que structure et buffer soiet
initialisées toutes les deux avant de faire ça.


c'est la cas

(2) structure=*((maStructure*)buffer);
ne marche pas. Tu essaies de copier un objet de type maStructure dans

une adresse.



désolé j'ai oublié l'étoile que j'avais dans mon code mais ;)
donc voila rectification
(2) *structure=*((maStructure*)buffer);


Serge Paccalin
Le #583106
Le vendredi 5 mars 2004 à 22:08:11, Sylvère a écrit dans
fr.comp.lang.c :

Il faut que structure et buffer soiet
initialisées toutes les deux avant de faire ça.


c'est la cas

(2) structure=*((maStructure*)buffer);
ne marche pas. Tu essaies de copier un objet de type maStructure dans

une adresse.



désolé j'ai oublié l'étoile que j'avais dans mon code mais ;)
donc voila rectification
(2) *structure=*((maStructure*)buffer);


D'accord. Dans ce cas, on retrouve bien l'équivalent du memcpy().

Personnellement, je préfère l'affectation, ça me parait mieux refléter
ce qu'on veut faire (recopier un objet dans un autre) ; memcpy(), c'est
vraiment pour des buffers ou des tableaux.

--
___________ 2004-03-05 22:09:44
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763



Randolf Carter
Le #582857
Personnellement, je préfère l'affectation, ça me parait mieux refléter
ce qu'on veut faire (recopier un objet dans un autre) ; memcpy(),
c'est

vraiment pour des buffers ou des tableaux.


De plus l'affectation est beaucoup plus performante. On évite un appel
de fonction et un bon compilateur générera des instructions de copie
optimales.

--
- Randolf

Benoît Dejean
Le #582853
Le Sat, 06 Mar 2004 10:19:58 +0100, Randolf Carter a écrit :


De plus l'affectation est beaucoup plus performante. On évite un appel
de fonction et un bon compilateur générera des instructions de copie
optimales.


idem pour memcpy : un compilteur décent inlinera le tout, de telle sorte
que l'affectation produira le même code objet que memcpy

Publicité
Poster une réponse
Anonyme