4 votes

Un syndicat est-il lui-même un type de présentation standard ?

Si j'ai un type de mise en page standard comme celui-ci :

struct sl_t
{
  int a;
};

Et un syndicat comme celui-ci :

union un_t
{
  int b;
  double q;
};

Puis-je utiliser l'union comme type de structure ? Autrement dit, puis-je supposer que l'union elle-même est un type standard et que les données sont alignées au début de la mémoire ?

un_t obj;
sl_t * s = reinterpret_cast<sl_t*>(&obj);
s->a = 15;
assert( obj.b == 15 );

Ou dois-je prendre l'adresse de la variable dans l'union &obj.b ?

Notez que je suis déjà conscient que si je stocke la structure à l'intérieur de l'union, la norme C++11 garantit que je peux accéder à la fois à sl_t::a et à un_t::b, en me référant à 9.5-1.

3voto

slashmais Points 3924

Si l'alignement semble être votre problème, regardez pragma pack . Les noms de la structure/union ne font que référencer le bloc de mémoire alloué, si st_t.a est déplacé dans la structure en ajoutant d'autres membres, votre casting échouera, mais s'il reste le premier membre, il fonctionnera puisque tous les membres de l'union pointent vers la même adresse que l'union elle-même.

Voir la section 9.2.17 - 21 de la norme C++ : "Un pointeur vers un objet struct de format standard, convenablement converti à l'aide d'un reinterpret_cast, pointe vers son membre initial (ou si ce membre est un champ de bits, alors vers l'unité dans laquelle il réside) et vice versa."

Voir également la section 9.5 Unions : " 1. Dans une union, au plus un des membres de données non statiques peut être actif à tout moment, c'est-à-dire que la valeur d'au plus un des membres de données non statiques peut être stockée dans une union à tout moment ". [Note : Une garantie spéciale est faite afin de simplifier l'utilisation des unions : Si une union standard-layout contient plusieurs structures standard-layout qui partagent une séquence initiale commune (9.2), et si un objet de ce type d'union standard-layout contient l'une des structures standard-layout, il est permis d'inspecter la séquence initiale commune de n'importe lequel des membres de la structure standard-layout ; voir 9.2. - note de fin ] La taille d'une union est suffisante pour contenir le plus grand de ses membres de données non statiques. Chaque membre de données non statique est alloué comme s'il était le seul membre d'une struct."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X