[C C++] différence entre une struc et union

différence entre une struc et union [C C++] - C - Programmation

Marsh Posté le 26-11-2003 à 12:10:12    

désolé mais j'ai du mal a comprendre la différence en union et struct
 
surtout quand utiliser l'un ou l'autre
 
merci de laisser un commentaire :jap:

Reply

Marsh Posté le 26-11-2003 à 12:10:12   

Reply

Marsh Posté le 26-11-2003 à 12:12:34    

dans une struct, les champs mémoires sont contigus et il existe une zone mémoire par membre de la struct.
 
dans une union, tu peux avoir autant de membres que tu veux, mais une seule zone mémoire qui sera de la taille de ton plus grand membre.
 
edit: pour être plus clair, une struct peut contenir autant de données que tu veux, mais une union ne peut avoir qu'une seule donnée à la fois, même si tu en déclares plusieurs


Message édité par Harkonnen le 26-11-2003 à 12:13:58
Reply

Marsh Posté le 26-11-2003 à 12:17:10    

Citation :

dans une struct, les champs mémoires sont contigus

Heuuh .. il peut y avoir des "trous" entre les éléments il me semble, non ?

Reply

Marsh Posté le 26-11-2003 à 12:18:17    

Cricri_ a écrit :

Citation :

dans une struct, les champs mémoires sont contigus

Heuuh .. il peut y avoir des "trous" entre les éléments il me semble, non ?
 

si il peut y a avoir quelques bourrages

Reply

Marsh Posté le 26-11-2003 à 12:19:43    

Cricri_ a écrit :

Citation :

dans une struct, les champs mémoires sont contigus

Heuuh .. il peut y avoir des "trous" entre les éléments il me semble, non ?
 


exact, du "bourrage" pour avoir un nombre pair d'octets.

Code :
  1. typedef struct _toto{
  2. char monChar;
  3. int monInt;
  4. } toto;
  5. sizeof toto = 6
  6. sizeof char + sizeof int = 5

Reply

Marsh Posté le 26-11-2003 à 12:21:26    

moktar1er a écrit :


exact, du "bourrage" pour avoir un nombre pair d'octets.

rien à voir

Reply

Marsh Posté le 26-11-2003 à 12:22:26    

Taz a écrit :

rien à voir


pourquoi ça fait toujours un nombre pair d'octets alors?

Reply

Marsh Posté le 26-11-2003 à 12:31:36    

Harkonnen a écrit :

dans une struct, les champs mémoires sont contigus et il existe une zone mémoire par membre de la struct.
 
dans une union, tu peux avoir autant de membres que tu veux, mais une seule zone mémoire qui sera de la taille de ton plus grand membre.
 
edit: pour être plus clair, une struct peut contenir autant de données que tu veux, mais une union ne peut avoir qu'une seule donnée à la fois, même si tu en déclares plusieurs


 
pas claire pour moi ? (et je vois pas très bien quand utiliser l'un plutot que l'autre)
 

Reply

Marsh Posté le 26-11-2003 à 12:31:50    

moktar1er a écrit :


pourquoi ça fait toujours un nombre pair d'octets alors?

rien à voir, c'est pour une question de performance. on a des machines 32bits, il va essayer d'aligner sur 32bits.  
 
gcc
-Wpacked
-Wpadded
-fpack-struct

Reply

Marsh Posté le 26-11-2003 à 12:33:03    

ben fait une union et une struct avec la même chose. regarde les tailles de l'union et de la structure, regarde les adresses des memebres

Reply

Marsh Posté le 26-11-2003 à 12:33:03   

Reply

Marsh Posté le 26-11-2003 à 12:33:14    

euh ouais OK ... j'aurais du donner tout le détails de ma pensée ...
pair->multiple de 32 etc. etc.

Reply

Marsh Posté le 26-11-2003 à 12:34:52    

moktar1er a écrit :

euh ouais OK ... j'aurais du donner tout le détails de ma pensée ...
pair->multiple de 32 etc. etc.

bref ça depend de ton architecture, les bourrage n'est pas obligatoire, loin de la

Reply

Marsh Posté le 26-11-2003 à 12:37:46    

startx25 a écrit :


 
pas claire pour moi ? (et je vois pas très bien quand utiliser l'un plutot que l'autre)
 
 


Code :
  1. typedef struct{
  2.    int a;
  3.    int b;
  4.    char c;
  5. }test;


 
ceci réserve suffisamment d'espace mémoire pour les 3 champs. (9 octets dans le cas d'un int de 4 octets). chaque champ sera donc accessible sans problème et aura sa propre valeur.
par contre :
 

Code :
  1. typedef union {
  2.    int a;
  3.    double b;
  4.    char c;
  5. }test;


 
ne réservera que l'espace mémoire nécessaire à un double (type le plus grand de l'union). donc si tu écris ça :
 

Code :
  1. test.b = 1457;


 
ça écrasera la valeur de test.a et test.c, ce qui n'est pas le cas dans une struct

Reply

Marsh Posté le 26-11-2003 à 12:48:55    

et au sens des types ? ça signifie quoi ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-11-2003 à 13:17:53    

que c'est comme d'habitude du très bas niveauet que
 

Code :
  1. uni.a = truc;
  2. bidule = uni.b;


 
a un comportement indéfini
 
seul

Code :
  1. uni.a = truc
  2. /* faire des trucs avec uni.a */
  3. uni.b = machin
  4. /* faire des trucs avec uni.b */


est bien défini est sur.
 
on utilise les union, soit pour faire des hacks (j'avais fait une démo à crisbk pour attraper un pointeur de fonction membre en C++), soit pour faire une économie d'espace auquel cas on adjoint une enum qui sert à indiquer le type/le champ à utiliser

Reply

Marsh Posté le 26-11-2003 à 14:02:11    

Taz a écrit :

que c'est comme d'habitude du très bas niveauet que
 

Code :
  1. uni.a = truc;
  2. bidule = uni.b;


 
a un comportement indéfini
 
seul

Code :
  1. uni.a = truc
  2. /* faire des trucs avec uni.a */
  3. uni.b = machin
  4. /* faire des trucs avec uni.b */


est bien défini et sur.[:aloy]
 
on utilise les union, soit pour faire des hacks (j'avais fait une démo à crisbk pour attraper un pointeur de fonction membre en C++), soit pour faire une économie d'espace auquel cas on adjoint une enum qui sert à indiquer le type/le champ à utiliser


A+,
PS. Comme j'ai aucune chance de corriger Taz sur le C++, je me rattrape sur l'orthographe [:chacal_one333]


Message édité par gilou le 26-11-2003 à 14:04:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-11-2003 à 14:09:15    

je me demande si c'est à moi que Taz répondait.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-11-2003 à 14:33:43    

ben demande ce que tu veux j'au pas bien compris ce que tu voulais

Reply

Marsh Posté le 26-11-2003 à 14:36:12    

Taz a écrit :

ben demande ce que tu veux j'au pas bien compris ce que tu voulais

Moi je sais ce que je veux, mais je réfléchis encore à la réponse ...
en fait j'ai quand même l'impression que struct et union ont _exactement_ le même sens au niveau des types.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-11-2003 à 14:44:03    

oui

Reply

Marsh Posté le 26-11-2003 à 14:55:46    

c'est pour ça qu'en essayant de mapper les unions sur un type somme ça foirait. Ils sont tous 2 des types produits. Seuls les enums (et les types primitifs, bien sur) sont des types somme.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed