Frage zu Union in C++

Gast #6609151
Lesenswert?

Hallo,

ich habe folgenden C++-Code gefunden:
1
static constexpr const unsigned W = 64, H = 32;
2

3
struct Chip8
4
{
5
  union
6
  {
7
    // The Chip-8 has 0x1000 bytes of RAM.
8
    unsigned char Mem[0x1000] {0x12,0x00};
9

10
    struct
11
    {
12
      unsigned char V[16], DelayTimer, SoundTimer, SP, Keys[16], WaitingKey;
13
      unsigned char DispMem[W*H/8], Font[16*5]; // monochrome bitmaps
14
      unsigned short PC, Stack[12], I;
15
    };
16
  };
17

18
  // ...

Ist es in C++ in Ordnung, wenn ich z.B. in Stack oder PC schreibe und 
dann aus Mem lese (oder umgekehrt)? Oder wäre das "verbotenes" Type 
Punning?
Gast #6609174
Lesenswert?

Erik R. schrieb:

> Ist es in C++ in Ordnung, wenn ich z.B. in Stack oder PC schreibe und
> dann aus Mem lese (oder umgekehrt)? Oder wäre das "verbotenes" Type
> Punning?

Ja, letzteres. Union type punning ist in C erlaubt (seit C99 IIRC), aber 
in C++ ist es undefined behaviour. Es kann je nach Compiler aber 
trotzdem funktionieren, zumindest bis zu dem Compiler-Update, wo es das 
dann nicht mehr tut.
Gast #6609437
Lesenswert?

Achim M. schrieb:
> Hier geht es ja um Makroassembler-Registergefummel.

Dazu nutze ich das nicht (und schon gar nicht Bitfields), sondern für 
Datenstrukturen, bei denen ich eine Union nullen, kopieren oder auf 
Gleichheit prüfen will.

Manchmal auch nur komponentenweise auf Gleichheit, dann mit xor/and. Das 
ist auf einem Controller mit 32 bit elegant und schnell als Union über 
einen uint32_t, weil man damit nur einen Branch verursacht.
Beitrag #6610498 wurde von einem Moderator gelöscht.
Gast #6612887
Lesenswert?

Achim M. schrieb:
> Nop schrieb:
>> zumindest bis zu dem Compiler-Update, wo es das dann nicht mehr tut.
>
> Da schreibste ein 'extern "C"' drumherum und dann sollte es doch ok
> sein. Hier geht es ja um Makroassembler-Registergefummel.
>
> mfg mf

Nö, hier hilft extern "C" nicht, das macht etwas ganz anderes.

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