Différences entre les versions de « Langage C++/Structures, unions et champs de bits »

Mise en garde sur l'utilisation des champs de bits
m (Orth., Typo., remplacement: à été → a été (2) avec AWB)
(Mise en garde sur l'utilisation des champs de bits)
=== Les Unions ===
 
Les unions sont une forme de typage faiblement typé. SaufLes casunions particulier,ont leurété utilisationconservée n’estdu pasC conseilléepour ;compatibilité d'autant plus qu’elleset ne correspondent pas à la philosophie d'un langage orienté objet.
 
Les unions permettent de créer des espaces mémoire où l’on peut interpréter une même donnée de différentes manières ou de diviser une même donnée en sous ensembles. En fait une union déclare la disposition tous ses membres en partant de la même adresse contrairement à la structure qui dispose ses membres les uns à la suite des autres.
 
Les champs de bits (ou "Drapeaux" de l'anglais "Flags"), qui ont leur principale application en industrie, sont des structures qui ont la possibilité de regrouper au plus juste dans un nombre d'octet moindre plusieurs valeurs. Cela vient directement du monde de l'électronique. Il existe nombres d'exemples de ce fonctionnement dans l’industrie.
 
Cela dit, les champs de bits sont très fortement déconseillé car aucun standard C, C++ ne fixe les règles d'implémentations.
 
La norme ISO C++ 14 (ISO/IEC JTC1 SC22 WG21 N 3690) énonce ceci :
 
"Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined."
 
Cela signifie qu'aucune garantie n'est fournie en ce qui concerne l'alignement mémoire. certains compilateur peuvent générer un exécutable demandant l'accès à deux cases mémoire simultanément. Si cela ne pose que des problèmes de performances sur Intel, d'autres processeurs peuvent générer une erreur d'accès non aligné à la mémoire (Cas des processeur Spark par exemple).
 
Cela signifie également que chaque compilateur peut implémenter le champ de bit à sa manière dans une classe (et donc par extension dans une structure). Deux compilateur peuvent alors générer deux exécutables aux comportement différents à partir du même code source.
 
Cela est vrais surtout en cas de cast ou d'union permettant de d'accéder à un champ de bit comme un seul entier ou champ par champ. Dans ce cas, rien de garanti l'ordre dans lequel serons accédés les champs de bit.
 
La tentation est trop forte pour ne pas faire une petite parenthèse sur le standard C (ISO/IEC 9899:201x) qui est encore plus explicitement permissif :
 
"An implementation may allocate any addressable storage unit large enough to hold a bit- field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified."
 
Cela veut dire la même chose mais sans sous entendus.
 
Bref, voici un champ de bit :
 
{{Définition|contenu='''Syntaxe:''' <source lang="cpp">
Utilisateur anonyme