El compilador puede optimizar su código porque buffer
no es un objeto volátil.
El estándar solo requiere que un compilador se adhiera estrictamente a la semántica para objetos volátiles. Esto es lo que dice C++ 03
Los requisitos mínimos en una aplicación conforme son:
- En los puntos de secuencia, objetos volátiles son estables en el sentido que las anteriores evaluaciones son completas y evaluaciones posteriores han aún no ocurrió. [...]
y
El comportamiento observable de la máquina abstracta es su secuencia de lecturas y escrituras de datos volátiles y llamadas a la biblioteca de funciones de E/S
En su ejemplo, lo que tienes es leer y escribir usando lvalues volátiles a objetos no volátiles. C++ 0x eliminó el segundo texto que cité arriba, porque es redundante. C++ 0x sólo dice
Los requisitos mínimos en una aplicación conforme son:.
- acceso a los objetos volátiles son evaluados estrictamente de acuerdo con las reglas de la máquina abstracta [...]
Estos colectivamente se conocen como comportamiento observable del programa.
Si bien se puede argumentar que "los datos volátiles" podría tal vez significar "datos accedidos por lvalues volátiles", que seguiría siendo un buen tramo, la redacción C++ 0x elimina todas las dudas sobre su código y claramente permite implementaciones para optimizarlo lejos.
Pero a medida que la gente me señalaron, es probable que no importa en la práctica. Un compilador que optimice tal cosa probablemente irá en contra de la intención del programador (de lo contrario alguien podría tener un puntero a la volatilidad) y probablemente contenga un error. Aún así, he experimentado vendedores de compiladores que citaron estos párrafos cuando se enfrentaron a informes de errores sobre sus optimizaciones demasiado agresivas. Al final, volatile
es específico de la plataforma y se supone que debes verificar el resultado de todas maneras.
Hmmm, creo que no es la situación exacta. Aquí el compilador sabe que la memoria está asignada en la pila, allí no. (por lo que puede apuntar a un registro mapeado en la memoria) – ybungalobill
Estaba a punto de publicar una pregunta similar con respecto a esta respuesta. Es curioso cómo una preocupación puede plantear muchas otras preguntas interesantes;) Aquí está mi +1. – ereOn
Intente declarar el búfer como 'buffer de caracteres volátiles [size];' en lugar de convertirlo en la llamada a 'std :: fill_n'. –