Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Copie de tableau dans la pratique

10 réponses
Avatar
candide
Bonjour,

Je voudrais savoir comment dans le monde des codeurs C (les vrais, pas
les lopettes de codeurs du dimanche et de juillet-août comme moi ;) ) on
copie un tableau 1 dans un tableau 2 de même type. Les méthodes que je
connais sont :

i) via une boucle qui copie chaque élément du tableau 1 dans l'élément
correspondant du tableau 2 ;

ii) en utilisant memcpy() ;

iii) en encapsulant les tableaux dans une structure et en assignant une
structure à l'autre.

Concernant la iii), je trouve qu'elle souffre de quelques limitations :

*) il faut autant de structures que de type de tableaux quoiq'une
macro-fonction peut donner un peu de souplesse
*) il faut encapsuler dès le début chaque tableau que l'on voudra copier

et je me demande si elle est vraiment utilisée où si c'est juste une
astuce un peu gratuite.

Vous allez peut-être me répondre qu'un vrai codeur ne copie pas de
tableau ...

Merci

10 réponses

Avatar
Alexandre BACQUART
candide wrote:
Bonjour,

Je voudrais savoir comment dans le monde des codeurs C (les vrais, pas
les lopettes de codeurs du dimanche et de juillet-août comme moi ;) ) on
copie un tableau 1 dans un tableau 2 de même type. Les méthodes que je
connais sont :

i) via une boucle qui copie chaque élément du tableau 1 dans l'élément
correspondant du tableau 2 ;

ii) en utilisant memcpy() ;

iii) en encapsulant les tableaux dans une structure et en assignant une
structure à l'autre.

Concernant la iii), je trouve qu'elle souffre de quelques limitations :

*) il faut autant de structures que de type de tableaux quoiq'une
macro-fonction peut donner un peu de souplesse



Pire, il faut autant de structures que de types *et de tailles* de
tableaux. Mais bon.

*) il faut encapsuler dès le début chaque tableau que l'on voudra copier

et je me demande si elle est vraiment utilisée où si c'est juste une
astuce un peu gratuite.



Un peu gratuit, juste pour pouvoir faire :

struct_array_dst = struct_array_src;

plutôt que :

memcpy(array_dst, array_src, array_size);

J'ai le sentiment que c'est pour ceux qui n'arrivent pas à bien accepter
le fait qu'en C "les tableaux n'existent pas", leur sémantique étant
celle des pointeurs (même s'il y a quelques facilités pour les tableaux
statiques, cela s'arrête à peu près là).

Après, si le plus gros du programme consiste à copier des tableaux sans
se soucier de leur taille, ça peut s'envisager, mais c'est ignorer
l'alignement et le padding des structures qui ne feront qu'augmenter la
consommation mémoire dans certains cas. Ce qui est plus ennuyeux, c'est
qu'utiliser le tableau nécessitera soit de spécifier la structure
(struct_array_dst.array[i]), soit d'introduire d'autres variables, soit
de faire d'autre macros.

Vous allez peut-être me répondre qu'un vrai codeur ne copie pas de
tableau ...



Pourquoi un 'vrai' codeur n'aurait jamais besoin de copier des choses ?
La question est de savoir si l'opération est nécessaire car elle a un
coût en mémoire occupée et en temps d'exécution.


--
Alex
Avatar
Thierry B.
--{ candide a plopé ceci: }--

Vous allez peut-être me répondre qu'un vrai codeur ne copie pas de
tableau ...



Le vrai c0d3urz hésite entre memcpy et memmove, perd trois jours
à monter un bench sans équivoque, et se rend finalement compte
que passer un pointeur était amplement suffisant.

Plus sérieusement, mais je ne suis pas une référence, j'utilise
memcpy pour copier les tableaux, et j'éviterais l'encapsulation
dans la structure parce que, à mon sens, elle ne fait que masquer
le fait que l'on copie des bits. Une question d'habitude...


--
« C'est toi qui l'as dit, c'est toi qui y es. »
--{ NG, in fcol.debats }--
Avatar
espie
In article <4877d195$0$11560$,
candide wrote:
Bonjour,

Je voudrais savoir comment dans le monde des codeurs C (les vrais, pas
les lopettes de codeurs du dimanche et de juillet-août comme moi ;) ) on
copie un tableau 1 dans un tableau 2 de même type. Les méthodes que je
connais sont :

i) via une boucle qui copie chaque élément du tableau 1 dans l'élément
correspondant du tableau 2 ;

ii) en utilisant memcpy() ;

iii) en encapsulant les tableaux dans une structure et en assignant une
structure à l'autre.

Concernant la iii), je trouve qu'elle souffre de quelques limitations :



Il faut se poser la question: a quoi sert ton tableau ?

Dans pas mal de cas, si tu risques d'etre amene a le copier, c'est soit
qu'il est element naturel d'une structure (ou assimile), par exemple,
un jeu de coordonnees pour faire de la geometrie, et donc il suffit de copier
la structure, ou alors, qu'il est suffisamment central a ton algorithme
pour ne pas avoir de taille fixe...

Tu peux alors faire du memcpy/memmove ou une boucle... sur des compilos
recents, le choix n'a pas enormement d'incidence...

Comme le dit fort justement Alex dans le message cousin, si tu commences
a te poser des soucis d'optimisation, en general, tu finis par arriver
a te passer de la copie...
Avatar
Pierre Maurette
candide, le 11/07/2008 a écrit :
Bonjour,

Je voudrais savoir comment dans le monde des codeurs C (les vrais, pas les
lopettes de codeurs du dimanche et de juillet-août comme moi ;) ) on copie un
tableau 1 dans un tableau 2 de même type. Les méthodes que je connais sont :

i) via une boucle qui copie chaque élément du tableau 1 dans l'élément
correspondant du tableau 2 ;



Il y a une variante, si on considère que la question a essentiellement
de l'intérêt si les tableaux sont un peu charnus.
C'est, s'il s'agit d'un tableau de "petits types" (typiquement des
char), de copier des plus gros entiers. Des int, ou des long (Linux,
64bit par exemple). Soit on aligne la taille des tableau sur un
multiple du gros type, soit on copie ce qui est divisible par le gros
type, puis on complète par ce qui reste.
Bref, on fait ce que fait peut-être memcpy().

ii) en utilisant memcpy() ;



Je pense que c'est ce qui est le mieux. C'est lisible, portable, à
priori optimisé pour chaque implémentation. Peut-être que memcpy() peut
utiliser des tecniques câblées (DMA) ?
J'utilise la variante de la méthode i), mais je pense que ce n'est pas
bien, c'est une mauvaise habitude que j'ai prise de ne pas assez
utiliser les fonctions de la bibliothèque standard.


iii) en encapsulant les tableaux dans une structure et en assignant une
structure à l'autre.

Concernant la iii), je trouve qu'elle souffre de quelques limitations :

*) il faut autant de structures que de type de tableaux quoiq'une
macro-fonction peut donner un peu de souplesse
*) il faut encapsuler dès le début chaque tableau que l'on voudra copier

et je me demande si elle est vraiment utilisée où si c'est juste une astuce
un peu gratuite.



Première fois que je vois ça. Assez obfuscatoire à mon sens. Pour
passer le tableau à des fonctions externes, standards en particulier,
il faudra passer s.t, et pour les fonctions perso, on risque
"d'oublier" et passer un gros tableau par copie de valeur.

--
Pierre Maurette
Avatar
candide
Avec un peu de retard, je vous remercie de vos différentes réponses.
Avatar
candide
Avec un peu de retard, je vous remercie de vos différentes réponses.
Avatar
-ed-
On 11 juil, 23:33, candide wrote:
Bonjour,

Je voudrais savoir comment  dans le monde des codeurs C (les vrais, pas
les lopettes de codeurs du dimanche et de juillet-août comme moi ;) ) o n
copie un tableau 1 dans un tableau 2 de même type. Les méthodes que j e
connais sont :

i) via une boucle qui copie chaque élément du tableau 1 dans l'él ément
correspondant du tableau 2 ;

ii) en utilisant memcpy() ;

iii) en encapsulant les tableaux dans une structure et en assignant une
structure à l'autre.

Concernant la iii), je trouve qu'elle souffre de quelques limitations   :

*) il faut autant de structures que de type de tableaux quoiq'une
macro-fonction peut donner un peu de souplesse
*) il faut encapsuler dès le début chaque tableau que l'on voudra cop ier

et je me demande si elle est vraiment utilisée où si c'est juste une
astuce un peu gratuite.

Vous allez peut-être me répondre qu'un vrai codeur ne copie pas de
tableau ...



J'allais commencer par ça. C'est effectivement une opération coûteuse
que l'on cherche à éviter. Ensuite, peu importe le codage, je fais
confiance au compilateur pour faire les optimis
Avatar
-ed-
On 11 juil, 23:33, candide wrote:
Bonjour,

Je voudrais savoir comment  dans le monde des codeurs C <...> on
copie un tableau 1 dans un tableau 2 de même type.


<...>
Vous allez peut-être me répondre qu'un vrai codeur ne copie pas de
tableau ...


J'allais commencer par ça. C'est effectivement une opération coûteuse
que l'on cherche à éviter. Ensuite, il est probable qu'un memcpy() a
de meilleures chances d'être optimisé correctement... Mais une boucle,
avec les compilateurs modernes, ça peut probablement donner le même
résultat... Dans le doute, faire des mesures, lire le code produit...
Avatar
candide
-ed- a écrit :


J'allais commencer par ça. C'est effectivement une opération coûteuse
que l'on cherche à éviter.



Certes mais un mergesort par exemple entraîne des copies inévitables.

Ensuite, peu importe le codage, je fais
confiance au compilateur pour faire les optimis



C'est noté.
Avatar
candide
-ed- a écrit :

Ensuite, il est probable qu'un memcpy() a
de meilleures chances d'être optimisé correctement...



C'est noté.