Strict pointer aliasing: Ist der Zugriff über einen 'volatilen' Pointer / Verweis auf eine Lösung?

8

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.

    
doublep 05.06.2010, 19:50
quelle

2 Antworten

15

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).

    
sellibitze 05.06.2010, 19:59
quelle
-3
  

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.

    
curiousguy 15.07.2012 00:35
quelle