Forum: Compiler & IDEs Ist eine UNION wirklich nötig?


von David H. (davidm)


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;

von Roland (Gast)


Lesenswert?

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.

von DirkB (Gast)


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.

von (prx) A. K. (prx)


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.

von David H. (davidm)


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

von (prx) A. K. (prx)


Lesenswert?

Ich seh's jetzt erst. Das ist schlicht und einfach Unsinn, denn da 
liegen alle 3 Bits übereinander statt nebeneinander, d.h. sind 
identisch:
1
union
2
{
3
    UINT8 bEventOnMin : 1;
4
    UINT8 bEventOnMax : 1;
5
    UINT8 bIsEventPending : 1;
6
} bits;

von Klaus (Gast)


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

von Roland (Gast)


Lesenswert?

Ja, UNIONS haben so ihre Tücken ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.