CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C-C++] Interet des unions

elhuron
elhuron
Niveau 6
19 novembre 2006 à 14:12:11

Bonjours.
J´apprends le C++ sur un bouquin, et je suis passé sur les unions.

union
{
int entier;
int float;
}nombre;

En C++, on peut ommettre de leur donner un titre (nombre).

A quoi peut servir deux variables qui se partagent la meme adresse ?

Le seul interet que je vois, c´est le fait de donner un code a un appareil tres petit, qui ne possede que tres peu de memoire, il faut donc user d´unions pour utiliser moin de memoire.

Et si on les utilises, il faudrais trifouiller beaucoup dans le code, pour redonner sans cesse la valeur a l´autre variable de l´union, et en faisant cela, l´ancienne valeur se perd.

Enfin bref, utilisez vous des unions ?
Si oui, pour quoi faire ?

elhuron
elhuron
Niveau 6
19 novembre 2006 à 14:24:43

union
{
int entier;
float flottant;
}nombre;

(Desole pour le double post.)

godrik
godrik
Niveau 30
19 novembre 2006 à 14:32:40

imaginons que je veuille implémenter un objet de type Variant comme en VB.
Le principe est que l´objet contient une valeur d´un type non définit.
on serait tenter de faire:
class Variant
{
int ID; //donne le type de la donné
int valeurint; //regarder ce champ si le type est
INT
char valeurchar; //regarder ce champ si le type es
t CHAR
float valeurfloat; //regarder ce champ si le type
est FLOAT;
};

Quel est la taille en mémoire de cette classe ? 2 int, un float un char. sur une machine 32 bit, cela fait 13 octets.
C´est dommage parcequ´en fait des différent valeur???, on n´en utilise qu´un seul a la fois.
D´ou l´idée de les faire se recouvrir en mémoire. Comme de toute façon on en utilise qu´un seul.
on obtient
class Variant
{
int ID;
union toto
{char valeurchar;
int valeurint;
float valeurfloat;
...
} valeur;
};
ainsi on ne consomme que 4 + max (sizeof(int, float, char)) octets en mémoire.

Une autre solution est de mapper les différents octet d´un entier.
Par exemple dans l´API windows, il est classique de voir:
short parameter; // le premier octets est la param
etre 1 et le deuxieme octet est le parametre 2

on peut donc facilement faire le découpage avec
union{
short parametre;
struct decoupage
{char param1, param2;}}

elhuron
elhuron
Niveau 6
19 novembre 2006 à 14:49:40

Merci godrick, j´y vois enfin une utilité :)

godrik
godrik
Niveau 30
19 novembre 2006 à 15:10:06

peut etre meme que certain l´utilise pour couper un float en mantisse, signe et exposant.
Ou encore peut etre pour faire du calcul sur decimal a virgule fixe.

kufa
kufa
Niveau 9
19 novembre 2006 à 16:22:23

Petit ajout: les unions permettent aussi de resoudre les problemes de strict aliasing.

guyver2
guyver2
Niveau 10
19 novembre 2006 à 16:26:48

Comment savoir dynamiquement quel type de donnée est veritablement stockée dans une variable de type union?

En reflechissant 2 secondes je pense que c´est au programmeur de se debrouiller a savoir ce qu´il manipule. En gros il dispose d´une zone mémoire dont il ne connait que la taille et c´est a lui de s´arranger pour savoir autrement le type de sa variable (en fonction du contexte ou de la valeur d´une autre variable).

Si cela se passe autrement merci de me le dire. (fonction getType() ? mais ça m´etonerai)

dnob700
dnob700
Niveau 10
19 novembre 2006 à 17:05:49

sauf à utiliser un marqueur de genre :

union
{
int type;
struct
{
int type;
...
} a;
struct
{
int type;
...
} b;
} u;

mais c´est lourd, c´est fait par endroit dans l´api win32.

perso, je me sers assez peu de l´union, car ce n´est pas très utile, sauf quand une fonction doit renvoyer plusieurs type de données différents, et qu´on ne sait pas à l´avance ce qui sera utilisé (c´est utilisé par exemple par bison, pour faire des parser), ou que la mémoire est vraiment très limité (mais quand on a de grosses structure de données, c´est souvent des classe (voir le paragraphe suivant)).

Mais le problème des union c´est que c´est du C et pas du tout du C++, particulièrement, pour des raisons claires, des classes munies de constructeurs ne peuvent pas êtres utilisées dans un union.

kufa
kufa
Niveau 9
19 novembre 2006 à 17:23:10

oui, que des POD, mais bon les unions peuvent etre tres pratiques. Dans ce cas (qui est tres utile par exemple dans lua ou autre language de scripting), dans le cas de resolution de problemes dus au strict aliasing, et lorsqu on veut pouvoir acceder a certaines partis d´un POD sans avoir a utiliser des masks et shifts (par exemple modifier un octet d un sockaddr_in).
L´utilisation des unions est rare, mais peut etre tres pratique dans certains cas particuliers.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment