Ist reinterpret_castchar * die einzig gültige Verwendung von reinterpret_cast?

7

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 verwenden

Danke

    
digitale 12.05.2016, 04:51
quelle

3 Antworten

9

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.

    
M.M 12.05.2016, 05:06
quelle
5

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.

    
templatetypedef 12.05.2016 04:59
quelle
5

Es gibt andere Verwendungen von reinterpret_cast , die nützlich sind.

Zeiger auf Integer-Typ

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%

Objekte im Rohspeicherblock speichern

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.

%Vor%

Ich bin sicher, dass es viele andere Anwendungen gibt, die ich nicht kenne, aber diese sind die, die ich bereits benutzt habe.

    
Guillaume Racicot 12.05.2016 05:09
quelle

Tags und Links