Quand utiliser un syndicat et quand utiliser une structure

Je connais les différences entre union et structure. Mais du sharepoint vue de la conception et du codage, quels sont les différents cas d’utilisation de l’union au lieu d’une structure? L’une est une optimisation de l’espace. Y a-t-il d’autres avantages à les utiliser?

Il n’y a vraiment que deux utilisations principales. La première consiste à créer un syndicat discriminé. C’est probablement ce à quoi vous pensiez par “optimisation de l’espace”, mais il y a un peu plus que cela. Vous avez besoin d’un peu plus de données pour savoir quel membre de l’union est “vivant” (contient des données valides) car le compilateur ne le fait pas pour vous. Vous voyez habituellement un code comme celui-ci ayant une union dans une structure, quelque chose comme:

struct mixed { enum { TYPE_INT, TYPE_FLOAT } type; union { int int_value; float float_value; } data; }; 

Lorsque vous affectez data.int_value ou data.float_value, vous devez également définir le membre de type sur la valeur d’énumération appropriée. Ensuite, votre code utilisant la valeur mixte peut déterminer s’il faut lire la valeur int_value ou float_value.

La deuxième utilisation importante des unions est de proposer une API qui permet à l’utilisateur d’accéder aux mêmes données de plusieurs manières. C’est assez limité, car tous les types de l’union doivent être mémorisés de manière identique. Par exemple, un int et un float sont complètement différents, et accéder à un float en tant qu’entier ne vous donne pas de données particulièrement significatives.

Pour un exemple utile de ce cas d’utilisation, voir le nombre d’API de réseau définissant une union pour les adresses IPv4, par exemple:

 union ipv4addr { unsigned address; char octets[4]; }; 

La plupart des codes veulent simplement faire passer la valeur entière sur 32 bits, mais certains codes veulent lire les octets individuels (octets). Tout cela est faisable avec les conversions de pointeur, mais c’est un peu plus facile, plus auto-documenté, et donc légèrement plus sûr d’utiliser une union de cette manière.

En général cependant, si vous n’êtes pas sûr d’avoir besoin d’un syndicat, vous n’en avez presque certainement pas besoin.

Vous utilisez un syndicat lorsque votre “chose” peut être l’une de nombreuses choses différentes, mais une seule à la fois.

Vous utilisez une structure lorsque votre “chose” devrait être un groupe d’autres choses.

Par exemple, une union peut être utilisée pour représenter des widgets ou des gizmos (avec un champ permettant de savoir ce que c’est), quelque chose comme:

 struct { int isAGizmo; union { widget w; gizmo g; } } 

Dans cet exemple, w et g vont se chevaucher en mémoire.

J’ai déjà vu cela dans les compilateurs où un jeton peut être une constante numérique, un mot clé, un nom de variable, une chaîne de caractères et de nombreux autres éléments lexicaux (mais, bien sûr, chaque jeton est l’ une de ces choses, vous ne pouvez pas avoir un seul est à la fois un nom de variable et une constante numérique).

Sinon, il peut être illégal de traiter des gizmos sans widgets, auquel cas vous pouvez utiliser:

 struct { widget w; gizmo g; } 

Dans ce cas, g serait dans un emplacement de mémoire distinct, quelque part après w (pas de chevauchement).

Les cas d’utilisation pour cela abondent, tels que les structures contenant des dispositions d’enregistrement pour votre application d’annuaire téléphonique qui vous rapporteront sans doute des milliards de dollars depuis votre magasin d’applications préféré 🙂

Dans certains cas, nous n’aurons peut-être à utiliser qu’une seule variable à la fois, mais les différents résultats devront être stockés avec des noms différents. Dans de tels cas, l’union facilitera l’atsortingbution du même espace pour chaque variable à un emplacement avec la taille de variable maximale.

c’est-à-dire que si nous utilisons int et char, l’union allouera de l’espace pour char qui a la taille la plus grande et que l’int sera également stocké dans le même espace que le dernier.

Vous ne pouvez pas comparer les syndicats aux structures, c’est comme comparer des pommes à des oranges, elles sont utilisées pour différentes choses. Les syndicats sont généralement utilisés dans des situations où l’espace est primordial, mais surtout pour des données exclusivement alternatives. Les syndicats aident à éliminer les fautes de frappe et à s’assurer que les états mutuellement exclusifs restnt mutuellement exclusifs car les erreurs de logique de programmation apparaîtront plus rapidement lorsque nous utilisons des unions pour des données mutuellement exclusives.

De plus, les unions peuvent faciliter le calcul des pointeurs lors de la manipulation de données complexes entre composants. Lors de la création de compilateurs avec LEX et YACC, les valeurs sont transmises du lexer à l’parsingur dans une union. L’implémentation de l’parsingur et la conversion ultérieure sont considérablement facilitées grâce à l’utilisation de l’union.