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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.