9
votes

C Union et fitfields

Les champs de bit peuvent être utilisés dans l'union?


3 commentaires

Lorsque vous faites deux choses perverses, faites-ils ou multiplie? ;-)


+1 à Amardeep. Ne pas et ne pas en dire de divie.


Ni les champs de bit ni les syndicats ne doivent être diaboliques. J'utilise des structures dans les unions pour analyser l'entrée / sortie des octets dans des logiciels incorporés. Son confort met en avant ses inconvénients.


4 Réponses :


2
votes

5 commentaires

Qu'est-ce qui n'est pas portable sur les champs de bits dans les syndicats comparés aux champs de bit en général? Quel est spécifiquement difficile de prédire?


La plainte dans le poste que vous avez lié concerne la taille de () une union contenant un bitfield, pas le comportement. La taille de la structure est toujours dépendante de la mise en œuvre et qui n'a rien à voir avec le Bitfield. Il y avait aussi une plainte concernant ne pas pouvoir prendre l'adresse d'un membre Bitfield, mais c'est à quel point les filets fonctionnent et n'ont rien à voir avec l'Union.


Mis à jour pour être moins vague. En général, je suis hyperparanoïde sur la taille / l'alignement de la mémoire car je travaille sur le microprogramme pour les microcontrôleurs. Les structures ou variables non alignées affectent les performances et peuvent entraîner des charges et des magasins non atomiques. Votre kilométrage peut varier.


Mais cela signifie fondamentalement que vous n'aimez pas les champs de bits en général. Pas immédiatement lié à la question initiale.


@Andreyt surtout, oui. Je pense que l'Union suscite le problème car chaque membre de l'Union contribue à la complexité de la détermination de la taille de l'Union. Je lis un peu de choses parce que j'ai vu ceci utilisé dans le cas où vous mappiez un protocole sur une structure C et un alignement mal préédcrexe entraînera des bugs. Y at-il encore une partie de ma réponse après la modification que vous pensez être vague ou trompeuse?



8
votes

Oui, ils peuvent être. Pourquoi pas? Les champs de bits en syndicats se comportent de la même manière qu'ils se comportent ailleurs. Il n'y a rien de spécial sur les champs de bits dans les syndicats (ou les syndicats avec des champs de bits).


0 commentaires

0
votes

Ce n'est que dangereux si vous écrivez sur un élément syndical et lisez-le d'un autre. Si les détails de votre mise en œuvre garantissent que cela ne se produit pas, une union contenant un comportement bien défini (et probablement d'autres membres) a un comportement sûr.


1 commentaires

Ce n'est pas C ++: le type Punning à travers les syndicats est parfaitement valable en C et se comporte de la même manière que c ++ 's REINERPRET_CAST . Le corrigendum technique 3 rend cela clair.



2
votes

Si vous pensez à la façon dont Union fonctionne, vous avez la réponse, qui est oui, bien sûr (pourquoi pas)? Comme nous nous attendons, l'Union est suffisamment importante pour tenir la plus grande donnée, et tellement la plus petite. Les fitfields sont emballés dans des "conteneurs" et le compilateur doit pouvoir évaluer leur taille réelle finale. Ce qui suit montre des faits intéressants (et bien sûr est une mauvaise utilisation d'un syndicat, mais pas pour la présence Bitfield!)

#include <stdio.h>

union test {
  int a:5;
  int b:12;
  float c;
  double d;
  int x;
};

int main()
{
  union test x;
  printf("%d\n", sizeof(x));
  x.a = 31;
  printf("%d\n", x.a);
  printf("%d\n", x.b);
  x.c = 1.23;
  printf("%d\n", x.a);
  printf("%f\n", x.c);
  x.x = 31;
  printf("%d\n", x.x);
  printf("%d\n", x.a);
  printf("%d\n", x.b);
}


0 commentaires