3 votes

Structure/union sans nom en tant que membre privé de la classe

Je travaille sur un code et je tombe sur quelque chose comme ça :

class Foo
{
private:
  union {
    byte bar;
    struct {
      byte baz1;
      byte baz2;
    };
  };
};

Maintenant, je compile avec un avertissement de niveau 4 sous VS 2010 (pure unmanaged) et bien sûr VS se plaint que nameless struct/union est une extension non standard (avertissement C4201) et je veux corriger cet avertissement.

Y a-t-il une raison quelconque pour laquelle quelqu'un préférerait ce qui précède à ce qui suit ?

class Foo
{
private:
  byte bar;
  byte baz1;
  byte baz2;
};

Ou y a-t-il une raison pour laquelle le remplacement de la première par la seconde ne fonctionnerait pas ?

2voto

A B Points 1685

Je suis sûr que vous le savez déjà - si un syndicat est utilisé la mémoire est partagée entre les membres de l'union. Votre deuxième exemple allouera un espace de stockage séparé pour tous les éléments mais pas le premier exemple (partagé entre bar et la structure anonyme). anonyme).

Les structures/unions sans nom ne sont pas recommandées en général. voir cette URL :

Pourquoi le C++ interdit-il les structures anonymes et les unions ?

Je pourrais imaginer que le passage de l'exemple 2 à l'exemple 1 soit un échec, mais pas le passage de l'exemple 1 à l'exemple 2. à moins que vous ne dépendiez du fait que le stockage est partagé dans dans un syndicat (ce qui est une TRES mauvaise pratique)

1voto

John Dibling Points 56814

Le fait de définir le niveau d'avertissement du compilateur à 4 émettra cet avertissement.

Oui, il y a des raisons pour lesquelles quelqu'un préfère une union à un struct . Les deux structures de données sont très différentes. Je ne m'étendrai pas sur les raisons pour ou contre l'utilisation d'une structure de données. union ici, car cela dépasse le cadre du présent document. voici un lien.

Si vous souhaitez conserver le syndicat, vous pouvez peut-être le faire :

class Foo
{
private:
  union {
    int bar;
    struct {
      int baz1;
      int baz2;
    } thing_;
  };
};

Il convient de noter que Foo a maintenant un membre nommé thing_ de type union .

0voto

marton78 Points 1067

Il y a certainement une raison. Votre solution nécessite 50 % d'espace mémoire en plus que la version avec l'union. De plus, avec l'union, foo.bar = foo.baz1 pour tous Foo foo;

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