2010-06-12 10 views
11

Vi que era posible hacerlo, pero no entiendo el interés.¿Cuál es el propósito del const_cast <> en un volátil?

+0

¿Estás preguntando sobre la conversión de 'const volátil' a' volátil' u otra cosa? –

+0

Como siempre, publicar algún código ayudaría. –

+0

Se eliminó la etiqueta C porque el lenguaje C no tiene 'const_cast <>' –

Respuesta

22

He aquí una Dr. Dobbs article por Andrei Alexandrescu que entra en cantidades obscenas de más detalles al respecto.

+0

Ese es un artículo extremadamente interesante. Upvoted. – Puppy

+0

Al igual que con muchas otras cosas que Alexandrescu ha escrito, ese artículo es esclarecedor. Hice una pregunta sobre ese artículo y el abuso del calificador 'volátil' que propone hace algún tiempo http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –

+0

De hecho, es un gran artículo. Gracias por compartir. +1. – jweyrich

3

const y volatile parece que se refieren a la misma idea en una variable, pero no es así. Una variable const no puede ser cambiada por el código actual. Una variable externa puede cambiar una variable volatile fuera del código actual. Es posible tener una variable const volatile, especialmente algo así como un registro mapeado en la memoria, que la computadora cambia en un momento en que su programa no puede predecir, pero que su código no puede cambiar directamente. Puede usar const_cast para agregar o eliminar const o volatile ("cv-qualification") a una variable.

4

const y volatile son ortogonales.

const significa que los datos son de solo lectura.

volatile significa que la variable podría estar cambiando debido a razones externas por lo que el compilador necesita leer la variable de la memoria cada vez que se hace referencia a ella.

Así que eliminar const le permite escribir lo que de otra manera sería una ubicación de solo lectura (el código debe tener algún conocimiento especial de que la ubicación es realmente modificable). No debe quitar volatile escribirlo, ya que podría provocar un comportamiento indefinido (debido a 7.1.5.1/7 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.)

+2

'const_cast' se aplica a' const' y 'volátil', y si bien la eliminación de' volátil' puede causar un comportamiento indefinido , hay casos donde no. Es decir. agregar barreras de memoria obligará al compilador a no almacenar en caché la variable y proporciona una garantía más sólida de que 'volátil' (no solo la variable no se almacenará en caché, sino que las instrucciones no se reordenarán fuera de la sección crítica). –

Cuestiones relacionadas