Florian Otte schrieb:
> Wenn es ein alignment Problem gäbe, dann müsste alles falsch alignes
> sein und nicht nur die daten an der (falsch) gecasteten ersten Stelle,
> oder?
Es geht hier nicht um Alignment, sondern um Aliasing. Aliasing heißt,
dass ein und dasselbe Objekt über mehrerer Namen erreichbar ist. Das
kann bei der Optimierung Probleme machen, wenn der Compiler versucht,
aus Effizienzgründen die Ausführungsreihenfolge von Anweisung zu ändern
(aka reordering).
Beispiel:
ist in C/C++ bekanntlich undefiniert, da die Auswertungsreihenfolge der
Parameter explizit undefiniert und folglich nicht klar ist, ob als
erster Parameter i oder i+1 übergeben wird.
ist OK (zumindest in C (*)),
dagegen nur, solange die Pointer auf unterschiedliche Objekte zeigt,
also i != j gilt. ((*) in C++ könnte i auch als
definiert sein und umgekehrt, daher die Einschränkung.)
Wenn der Compiler nun zur Optimierung die an sich wohldefinierte
Ausführungsreihenfolge von Anweisungen zu ändern versucht hat er ein
ganz ähnliches Problem. Er darf das nur, wenn die Semantik des Programms
unverändert bleibt. Dazu muss er eventuelles Aliasing im Auge behalten
können. Bei Casten vom Pointern inkompatibler Typen kann er das nicht
mehr (garantieren), es ist daher undefiniertes Verhalten, daher die
Warnung.
PS: Bei char* gibt es eine Ausnahme: Hier macht der Compiler per
Definition immer pessimistische Annahmen betreffs Aliasing, daher könnte
Punkt 2 oben funktionieren.
PPS: Aliasing ist nur ein potentielles Problem bei Casten von Pointern
unterschiedlichen Typs. Alignment und Bytefolgeprobleme kommen noch
dazu. Daher würde ich – wie gesagt – immer Variante 4 (siehe oben)
empfehlen.