Once again: strenge Aliasing-Regel und char *

Je mehr ich lese, desto verwirrter wird es.

Die letzte Frage von den verwandten ist meiner Frage am nächsten, aber ich wurde mit allen Wörtern über die Lebensdauer des Objekts verwechselt und besonders - ist es in Ordnung, nur zu lesen oder nicht.

Um direkt auf den Punkt zu kommen. Korrigiere mich, wenn ich falsch liege.

Das ist in Ordnung, gcc gibt keine Warnung und ich versuche zu "Typ lesenT (uint32_t) überchar* ":

uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );

Aber das ist "schlecht" (gibt auch eine Warnung) und ich versuche "anders herum":

char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );

Wie unterscheidet sich die zweite von der ersten, insbesondere, wenn es um das Neuordnen von Anweisungen (zur Optimierung) geht? Plus, Hinzufügen vonconst ändert nichts an der Situation.

Oder das ist nur eine klare Regel, die klar sagt: "Das kann in die eine Richtung gemacht werden, aber nicht in die andere"? Ich konnte in den Standards nichts Relevantes finden (gesucht wurde dies vor allem in C ++ 11 Standard).

Ist das für C und C ++ gleich (wenn ich einen Kommentar lese, was bedeutet, dass er für die beiden Sprachen unterschiedlich ist)?

Ich benutzteunion um dies zu "umgehen", was immer noch @ zu sein scheiNICH 100% OK, da dies vom Standard nicht garantiert wird (der besagt, dass ich mich nur auf den Wert verlassen kann, der zuletzt im @ geändert wurunion).

So, nach dem Lesen vonvie, Ich bin jetzt mehr verwirrt. Ich vermute nurmemcpy ist die "gute" Lösung?

Verwandte Fragen:

Was ist die strikte Aliasing-Regel? "Die Dereferenzierung eines typgesteuerten Zeigers verstößt gegen strenge Aliasing-Regeln" warning Verstehe ich C / C ++ - Strict-Aliasing richtig?Strict Aliasing-Regel und 'char *' Zeiger

BEARBEITE
Die reale Situation: Ich habe eine Drittanbieter-Bibliothek http: //www.fastcrypto.org), berechnet UMAC und der zurückgegebene Wert ist inchar[ 4 ]. Dann muss ich das in @ konvertieruint32_t. Und übrigens verwendet die lib Dinge wie((UINT32 *)pc->nonce)[0] = ((UINT32 *)nonce)[0] viel. Wie auch immer

Auch ich frage, was ist richtig und was ist falsch und warum. Nicht nur über die Nachbestellung, Optimierung usw. (was interessant ist, dass mit-O0 Es gibt keine Warnungen, nur mit-O2).

Und bitte beachten Sie: Ich bin mir der Big / Little-Endian-Situation bewusst. Das ist hier nicht der Fall. Ich möchte das Endianness hier wirklich ignorieren. Die "strengen Aliasing-Regeln" klingen wie etwas wirklich Ernstes, weitaus ernster als falsche Endianität. Ich meine - wie das Zugreifen auf / Ändern von Speicher, der nicht berührt werden soll;irgendei Art von UB überhaupt.

Zitate aus den Normen (C und C ++) wäre sehr dankbar. Ich konnte nichts über Aliasing-Regeln oder relevantes finden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage