Auf den Fersen von ein spezifisches Problem , eine Selbstantwort und Kommentare dazu, würde ich gerne verstehen, ob es eine richtige Lösung, Workaround / Hack oder einfach nur falsch ist.
Insbesondere habe ich den Code umgeschrieben:
%Vor%Wie:
%Vor% mit einem volatile
Qualifier für den Zeiger.
Nehmen wir an, dass es sinnvoll ist, T
als int
in meiner Situation zu behandeln. Wird durch das Zugreifen auf eine volatile
-Referenz das Pointer-Aliasing-Problem gelöst?
Für eine Referenz von der Spezifikation:
[Hinweis: volatil ist ein Hinweis auf die Implementierung, um aggressiv zu vermeiden Optimierung mit dem Objekt, weil der Wert des Objekts könnte durch Mittel, die durch eine Implementierung nicht nachweisbar sind, geändert werden. Siehe 1.9 für detaillierte Semantik. Im Allgemeinen ist die Semantik von flüchtigen Substanzen beabsichtigt in C ++ gleich sein wie in C. - Endnote]
BEARBEITEN:
Der obige Code hat mein Problem zumindest in GCC 4.5 gelöst.
Volatile kann Ihnen hier nicht helfen, undefiniertes Verhalten zu vermeiden. Also, wenn es für dich mit GCC funktioniert, ist es Glück.
Nehmen wir an, T ist ein POD. Dann ist der richtige Weg dazu
%Vor%Dort! Kein striktes Aliasing-Problem und kein Speicherausrichtungsproblem. GCC behandelt sogar memcpy als eine intrinsische Funktion (in diesem Fall wird kein Funktionsaufruf eingefügt).
Volatile kann Ihnen hier nicht helfen, undefiniertes Verhalten zu vermeiden.
Nun, irgendetwas bezüglich volatile
ist im Standard etwas unklar. Ich stimme Ihrer Antwort größtenteils zu, aber jetzt möchte ich ein wenig widersprechen.
Um zu verstehen, was volatile
bedeutet, ist der Standard für die meisten Leute, insbesondere für einige Compiler-Autoren, nicht klar. Es ist besser zu denken:
Bei Verwendung von volatile
(und nur wenn) ist C / C ++ ziemlich viel auf hoher Ebene .
Beim Schreiben in einen volatile
lvalue gibt der Compiler einen STORE oder mehrere STORE aus, wenn einer nicht genug ist ( volatile
impliziert nicht atomar).
Beim Schreiben in volatile
lvalue gibt der Compiler eine LOAD oder mehrere LOAD aus, wenn eine nicht genug ist.
Natürlich, wo es keine explizite LOAD oder STORE gibt, wird der Compiler nur Anweisungen ausgeben, die ein LOAD oder STORE beinhalten.
sellibitze lieferte die beste Lösung: Verwenden Sie memcpy
für Bit-Neuinterpretationen.
Wenn jedoch alle Zugriffe auf eine Speicherregion mit volatile
lvalues durchgeführt werden, ist es vollkommen klar, dass die strengen Aliasregeln nicht gelten . Dies ist die Antwort auf Ihre Frage.
Tags und Links c++ volatile strict-aliasing type-punning