OVH Cloud OVH Cloud

c quoi le plus rapide ...

14 réponses
Avatar
dark poulpo
bonjour,

d'apres vous, c'est quoi le plus rapide entre


int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


merci d'avance

10 réponses

1 2
Avatar
Marc Boyer
In article <419a0d8e$0$18771$, dark poulpo wrote:
bonjour,

d'apres vous, c'est quoi le plus rapide entre


int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


A priori
*( (int*) gauche->data )= r;
car le compilateur sait combien de char il doit copier,
et utiliser éventuellement l'instruction qui va bien
du processeur.

Alors que
memcpy
doit dynamiquement gérer sizeof(int) et peut-être même
faire un appel de fonction.

Ceci dit, si quelqu'un me dit que sur sa platerforme,
c'est le contraire, je serais pas étonné.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Jean-Marc Bourguet
"dark poulpo" writes:

bonjour,

d'apres vous, c'est quoi le plus rapide entre


int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


Si ca a de l'importance, mesure, sinon fait le plus clair:

*static_cast<int*>(gauche->data) = r;

qui a priori sera plus rapide. Ca ne m'etonnerait pas que certains
compilateurs fassent la meme chose pour les deux -- memcpy est
standard et sizeof(int) est connu -- , mais ca m'etonnerait qu'il y en
ait qui gerent mieux memcpy que l'assignation -- par exemple sur des
machines avec des contraintes d'alignement fortes pour les int, la
premiere version permet de supposer que gauche->data est correctement
aligne, pas la deuxieme.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
kanze
"dark poulpo" wrote in message
news:<419a0d8e$0$18771$...

d'apres vous, c'est quoi le plus rapide entre

int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


Qu'importe, puisqu'il ne font pas la même chose. Si la sémantique du
programme exige le premier, le séconde ne marche pas, et vice versa. (En
général, le deuxième a un comportement indéfini, si data est un void*.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
PurL
int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


Qu'importe, puisqu'il ne font pas la même chose.


Soit plus précis ! l'autre exemple fait quoi s'il ne place pas la valeur de
r à l'adresse gauche->data ?

PurL


Avatar
Laurent Deniau
wrote:
"dark poulpo" wrote in message
news:<419a0d8e$0$18771$...


d'apres vous, c'est quoi le plus rapide entre



int *g =(int *)gauche->data; // data est void *
(*g) = r;



ET



memcpy(gauche->data,&r,sizeof(int));



Qu'importe, puisqu'il ne font pas la même chose. Si la sémantique du
programme exige le premier, le séconde ne marche pas, et vice versa. (En
général, le deuxième a un comportement indéfini, si data est un void*.)


Je ne crois pas que le deuxieme soit un UB si tu penses aux problemes
d'alignement.

int r1, r2;
r1;
memcpy(gauche->data,&r1,sizeof(int));
r1=0;
memcpy(&r2,gauche->data,sizeof(int));

meme si gauche->data n'est pas aligne pour recevoir un int (je suppose
par contre qu'il y a la place de mettre un int), il n'y a pas de UB.
memcpy considere les src et dst comme des array de unsigned char. Tant
que cet array n'est pas interprete comme contenant un int, il ne devrait
pas y avoir de UB.

a+, ld.


Avatar
kanze
Laurent Deniau wrote in message
news:<cnfk02$f9k$...
wrote:
"dark poulpo" wrote in message
news:<419a0d8e$0$18771$...

d'apres vous, c'est quoi le plus rapide entre

int *g =(int *)gauche->data; // data est void *
(*g) = r;

ET

memcpy(gauche->data,&r,sizeof(int));


Qu'importe, puisqu'il ne font pas la même chose. Si la sémantique du
programme exige le premier, le séconde ne marche pas, et vice
versa. (En général, le deuxième a un comportement indéfini, si data
est un void*.)


Je ne crois pas que le deuxieme soit un UB si tu penses aux problemes
d'alignement.


Non. J'avais mal lu l'orginal, et je croyais que c'était le pointeur
qu'on copiait. Copier un void* dans un int*, et puis espérer accéder à
un int, a un comportement indéfini. Dans la mésure que les deux zones
mémoire ont le même type, et qu'il s'agit des POD, en revanche, le
memcpy doit marcher. (En ce qui concerne l'alignement, si le void* n'a
pas été initialisé avec un int* avant, les deux versions ont un
comportement indéfini.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Laurent Deniau
wrote:
Laurent Deniau wrote in message
wrote:
(En ce qui concerne l'alignement, si le void* n'a

pas été initialisé avec un int* avant, les deux versions ont un
comportement indéfini.)


C'est la que je ne te suis pas. Est ce que:

{
unsigned char buf[sizeof(int)]; // buf pas aligne sur un int*
int v1, v2;

v1;
memcpy(buf,&v1,sizeof(int));
memcpy(&v2,buf,sizeof(int));
// equivalent de v2 = v1
}

a un UB? Je ne crois pas.

a+, ld.


Avatar
Jean-Marc Bourguet
Laurent Deniau writes:

wrote:
Laurent Deniau wrote in message
wrote:
(En ce qui concerne l'alignement, si le void* n'a

pas été initialisé avec un int* avant, les deux versions ont un
comportement indéfini.)


C'est la que je ne te suis pas. Est ce que:

{
unsigned char buf[sizeof(int)]; // buf pas aligne sur un int*
int v1, v2;

v1;
memcpy(buf,&v1,sizeof(int));
memcpy(&v2,buf,sizeof(int));
// equivalent de v2 = v1
}

a un UB? Je ne crois pas.


Ce qui est copie peut ne pas etre un int acceptable par
l'architecture.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Laurent Deniau
Jean-Marc Bourguet wrote:
Laurent Deniau writes:


wrote:

Laurent Deniau wrote in message

wrote:


(En ce qui concerne l'alignement, si le void* n'a
pas été initialisé avec un int* avant, les deux versions ont un
comportement indéfini.)


C'est la que je ne te suis pas. Est ce que:

{
unsigned char buf[sizeof(int)]; // buf pas aligne sur un int*
int v1, v2;

v1;
memcpy(buf,&v1,sizeof(int));
memcpy(&v2,buf,sizeof(int));
// equivalent de v2 = v1
}

a un UB? Je ne crois pas.



Ce qui est copie peut ne pas etre un int acceptable par
l'architecture.


lequel? ou-t-il question d'un int, je ne vois que des sizeof(int) et des
void*?

a+, ld.




Avatar
Laurent Deniau
Laurent Deniau wrote:
wrote:

Laurent Deniau wrote in message

wrote:


(En ce qui concerne l'alignement, si le void* n'a
pas été initialisé avec un int* avant, les deux versions ont un
comportement indéfini.)



C'est la que je ne te suis pas. Est ce que:

{
unsigned char buf[sizeof(int)]; // buf pas aligne sur un int*


Lire char buf. Je ne sais pas pourquoi j'ai mis unsigned (bien que dans
la pratique il n'y ait pas de difference pour ce qui suit).

int v1, v2;

v1;
memcpy(buf,&v1,sizeof(int));
memcpy(&v2,buf,sizeof(int));
// equivalent de v2 = v1
}

a un UB? Je ne crois pas.


Mais en regardant 6.5-6 (effective type), j'ai un doute...

If a value is copied into an object having no declared type using
memcpy or memmove, or is copied as an array of character type, then the
effective type of the modified object for that access and for subsequent
accesses that do not modify the value is the effective type of the
*object from which the value is copied*, if it has one.

Est-ce que par hasard cela voudrait dire que memcpy et memmove seraient
en droit d'optimiser la copie en fonction de l'alignement (et de la
taille) de la src independament de la dst et donc que la dst doit
repondre au meme contraintes d'alignement que la src? J'ai du mal a le
croire car si la src vient d'un malloc, on aurait un UB sur la pluspart
des dst qui ne viennent pas aussi d'un malloc.

a+, ld.



1 2