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

m
=== Champs de bits ===
 
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'octetoctets 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édéconseillés 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 compilateurcompilateurs 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éalignée à 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 compilateurcompilateurs peuvent alors générer deux exécutables aux comportement différents à partir du même code source.
 
Cela est vraisvrai 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 dene garantigarantit l'ordre dans lequel seronsseront 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 :
==== Alternative aux champs de bits ====
 
À l'instar de l'union et de la structure, une classe et ses méthodes qui encapsulent les castings seront plus clairsclaires et propres que de manipuler plusieurs sous-noms différents d'une même variable.
 
{{Bas de page
48

modifications