Ist eine UNION wirklich nötig?

#3357141
Lesenswert?

Wenn ich auf .val verzichten kann, ist es denoch erforderlich eine union 
zu haben um sicher zu stellen das nur ein UINT8 verwendet wird?
1
    union
2
    {
3
        struct
4
        {
5
   UINT8 bEventOnMin : 1;
6
   UINT8 bEventOnMax : 1;
7
   UINT8 bIsEventPending : 1;
8
  } bits;
9
            UINT8 val;
10
  } flags;

Ich habe es mal so Probiert, und siehe da, anhand der addresse sieht man 
das nur 1 UINT8 belegt wird. und so nur die bits geteilt werden
1
    struct
2
        {
3
   UINT8 bEventOnMin : 1;
4
   UINT8 bEventOnMax : 1;
5
         UINT8 bIsEventPending : 1;
6
  } bits;


Da Frage ich mich aber wo ist der unterschied zu einem:
1
    union
2
        {
3
   UINT8 bEventOnMin : 1;
4
   UINT8 bEventOnMax : 1;
5
         UINT8 bIsEventPending : 1;
6
  } bits;
Gast #3357194
Lesenswert?

Bei einer Union teilen sich die Elemente den Speicher.
Bei einer struct liegen sie hintereinander im Speicher.

Bei deiner struct bits hast du also 3 unterschiedliche Bits, die 
unabhängig voneinander sind.

Bei der union bits hast du nur ein Bit, das über drei verschiedenen 
Bezeichner angesprochen werden kann.
#3357237
Lesenswert?

Roland schrieb:
> Es ist Plattform- und Kompilerabhängig, wie dein Struct letztlich im
> Speicher aussehen wird. So kann ess durchaus passieren, dass auf
> Plattformen 3Byte Speicher genutzt werden.

Im Prinzip richtig - allerdings kann man bei Prozessoren für allgemeinen 
Einsatz davon ausgehen, dass diese 3 Bits dicht an dicht liegen. Offen 
ist eher, ob die Bits von links nach rechts oder umgekehrt vergeben 
werden, und wie es sich verhält, wenn ein Bitfeld >1 über eine 
Wortgrenze zu liegen kommt.

David Mueller schrieb:
> Wenn ich auf .val verzichten kann, ist es denoch erforderlich eine union
> zu haben um sicher zu stellen das nur ein UINT8 verwendet wird?

Nein. Eine Union ist stets so gross wie das grösste Element, in Bytes, 
aufgerundet. In diesem Fall also mit Sicherheit mindesten 1 Byte. Wenn 
die Bitfield-Struct aber tatsächlich mal 3 Bytes gross sein sollte, dann 
wird sie durch .val nicht kleiner.
#3357265
Lesenswert?

DirkB schrieb:
> Bei deiner struct bits hast du also 3 unterschiedliche Bits, die
> unabhängig voneinander sind.

Das dachte ich auch, nur in wirklichkeit kann ich sehen das im MPLABX 
beim debuggen alle 3 nur eine Addresse haben, sie verhalten sich also 
gleich der union.

Scheinbar erkennt er das ich hier auf die bits zugreife und macht von 
selbst eine union
Gast #3357286
Lesenswert?

David Mueller schrieb:
> Das dachte ich auch, nur in wirklichkeit kann ich sehen das im MPLABX
> beim debuggen alle 3 nur eine Addresse haben, sie verhalten sich also
> gleich der union.

Bits haben keine eigene Adresse. 3 verschiedene Bits in einem Byte haben 
im Speicher die gleiche Adresse und sind trotzdem verschiedene Entities.

MfG Klaus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren