Ich habe kürzlich erfahren, dass der C ++ - Standard "strikte Aliasing-Regeln" enthält, die es verbieten, über Variablen verschiedener Typen auf denselben Speicherort zu verweisen.
Allerdings erlaubt der Standard, dass char
-Typen einen anderen Typ legal aliasieren. Heißt das, dass reinterpret_cast
legal nur dazu benutzt werden kann, um char *
oder char &
zu tippen?
Ich glaube, das strikte Aliasing erlaubt die Umwandlung zwischen Typen in einer Vererbungshierarchie, aber ich denke, diese Situationen würden dazu neigen, dynamic_cast & lt; & gt;?
zu verwendenDanke
Es gibt viele verschiedene Verwendungen von reinterpret_cast
. Die cppreference-Seite enthält 11 verschiedene Fälle.
Ich denke, Sie fragen nur nach den Fällen 5 und 6: Casting T *
auf U *
und Casting T
auf U &
.
In diesen Fällen ist die Besetzung legal, solange keine Ausrichtungsverletzung vorliegt. Das Problem des strengen Aliasing tritt nur auf, wenn Sie den resultierenden Ausdruck lesen oder schreiben.
Ihre Zusammenfassung der strengen Aliasing-Regel in Ihrem ersten Absatz ist eine große Vereinfachung, im Allgemeinen gibt es mehrere legale Typen für U
. Auf derselben cppreference-Seite finden Sie eine Aufzählung von Fällen. Sie können den genauen Text der Regel in einem C ++ - Standardentwurf lesen.
Sie können auch einen reinterpret_cast verwenden, um einen Zeigertyp auf einen Integer-Typ zu konvertieren:
%Vor%Der spezifische Ganzzahlwert, den Sie zurück erhalten, ist nicht plattformübergreifend übertragbar, aber dies ist eine sichere und wohldefinierte Operation.
Es gibt andere Verwendungen von reinterpret_cast
, die nützlich sind.
Ja, irgendwann möchte ich den Wert eines Zeigers in einem Integer-Typ speichern.
Der einzige Weg, dies mit C ++ - Style-Umwandlungen zu tun, ist mit reinterpret_cast
.
Beispiel:
%Vor% Manchmal möchten Sie Daten auf dem Stapel speichern, aber später initialisieren. Wenn dynamische Zuordnungen und Zeiger verwendet werden, wird der Stapel nicht verwendet. std::aligned_storage
macht einen guten Job als roher, ausgerichteter Speicherblock.
Ich bin sicher, dass es viele andere Anwendungen gibt, die ich nicht kenne, aber diese sind die, die ich bereits benutzt habe.
Tags und Links c++ strict-aliasing