Ist das std :: array undefiniertes Verhalten? [Duplikat]

8
  

Mögliche Duplikate:
Aliasing 'T *' mit 'char *' ist erlaubt. Ist es auch andersherum erlaubt?

Ich verwende ein std::array von char s, um einen Wert des unbekannten primitiven Typs zu speichern, der nicht länger als 10 Bytes ist, wie folgt:

%Vor%

Ich habe gelesen, dass die Umwandlung durch char * nicht undefiniert ist, weil der Compiler davon ausgeht, dass ein char * einen Wert beliebigen Typs aliasieren kann. Funktioniert das noch, wenn der Wert in ein Array von char s innerhalb des Objekts gelegt wird (was ich annahm)?

Hinweis: Mir ist bewusst, dass ich hier eine Verbindung verwenden könnte, aber das würde zu einer großen Menge Code für das, was ich tue, führen, und ich würde es gerne vermeiden, daher die Frage.

    
Dan 08.11.2012, 00:44
quelle

2 Antworten

13

Ja, std::array< char, 10 > erfüllt nicht die Ausrichtungsanforderungen von double , so dass reinterpret_cast UB provoziert.

Probieren Sie stattdessen std::aligned_storage .

    
Potatoswatter 08.11.2012, 00:49
quelle
0

Es spielt keine Rolle, in welchem ​​Array das Array enthalten ist.

Der Standard berücksichtigt nicht einmal, was etwas umgibt (so grundlegend), aber er unterstützt die Konvertierung in / aus char Sequenzen.

Um dies direkt über reinterpret_cast und Zuweisung zu tun, müssen Sie den Puffer korrekt ausgerichtet haben.

Eine Alternative ist die Verwendung von memcpy , was die Ausrichtung nicht interessiert.

Bei einem verwandten Problem ist es normalerweise keine gute Idee, auf die Binär-Ebene zu gehen. Zum Beispiel kann eine einfache Versionsänderung des Compilers eine Datei mit binär-serialisierten Daten unzugänglich machen. Ein Haupttreiber dafür sind ohnehin grobe Leistungsüberlegungen.

    
Cheers and hth. - Alf 08.11.2012 00:52
quelle

Tags und Links