Der Compiler kann Ihren Code frei optimieren, da buffer
kein flüchtiges Objekt ist.
Der Standard erfordert nur einen Compiler, um die Semantik für flüchtige Objekte strikt einzuhalten. Hier ist, was C++ 03 sagt
Die am wenigsten Anforderungen an eine konforme Implementierung sind:
- An Sequenzpunkte, flüchtige Objekte sind stabil in dem Sinne, dass die bisherigen Auswertungen sind vollständig und spätere Auswertungen haben noch nicht aufgetreten. [...]
]
und
Das beobachtbare Verhalten der abstrakten Maschine ist die Folge von liest und schreibt auf flüchtige Daten und Anrufe Bibliothek I/O-Funktionen
In Ihrem Beispiel, was Sie haben, liest und schreibt flüchtige lvalues zu nichtflüchtigen Objekten. C++ 0x hat den oben zitierten zweiten Text entfernt, weil er überflüssig ist. C++ 0x sagt nur
die am wenigsten Anforderungen an eine konforme Implementierung sind.
- Zugang zu flüchtigen Objekte werden nach den Regeln der abstrakten Maschine streng ausgewertet [...]
Diese zusammen werden als beobachtbares Verhalten des Programms bezeichnet.
Während man argumentieren kann, dass „feste Daten“ vielleicht „von flüchtigen lvalues griffenen Daten“ bedeuten könnten, die noch eine ganze Strecke sein würde, die C++ 0x Formulierung alle Zweifel an Ihrem Code entfernt und eindeutig erlaubt Implementierungen um es zu optimieren.
Aber wie die Leute auf mich hingewiesen haben, spielt es in der Praxis wahrscheinlich keine Rolle. Ein Compiler, der solch eine Sache optimiert, wird höchstwahrscheinlich gegen die Absicht des Programmierers gehen (warum hätte jemand sonst einen Zeiger auf flüchtig) und würde daher wahrscheinlich einen Fehler enthalten. Dennoch habe ich Compiler-Anbieter erlebt, die diese Absätze zitiert haben, als sie mit Fehlerberichten über ihre übermäßig aggressiven Optimierungen konfrontiert wurden. Am Ende ist volatile
inhärent plattformspezifisch und Sie sollten das Ergebnis trotzdem noch einmal überprüfen.
Hmmm, ich denke, dass es nicht die genaue Situation ist. Hier weiß der Compiler, dass der Speicher auf Stack zugeordnet ist, da nicht. (so kann es auf ein Speicher-Mapped-Register zeigen) – ybungalobill
Ich wollte eine ähnliche Frage bezüglich dieser Antwort stellen. Lustig, wie eine Sorge viele andere interessante Fragen aufwerfen kann;) Hier ist meine +1. – ereOn
Versuchen Sie, den Puffer als 'volatile char buffer [size]; 'zu deklarieren, anstatt ihn in den Aufruf von' std :: fill_n' zu werfen. –