Pregunta

Tengo una pregunta sobre la diferencia entre volátiles y mutables. Me di cuenta de que ambos de los dos medios que podría ser cambiado. ¿Qué más? ¿Son la misma cosa? ¿Cual es la diferencia? ¿Dónde están aplicable? ¿Por qué se proponen las dos ideas? Cómo utilizarlos de manera diferente?

Muchas gracias.

¿Fue útil?

Solución

Un campo mutable se puede cambiar incluso en un objeto accede a través de un puntero const o de referencia, o en un objeto const, por lo que el compilador sabe no para guardar en la memoria R / S. Una ubicación volatile es uno que puede ser cambiado por el código del compilador no sabe nada (por ejemplo algún conductor a nivel de kernel), por lo que el compilador sabe que no debe optimizar por ejemplo, registrar la asignación de ese valor no válido en el supuesto de que el valor "no es posible que haya cambiado", ya que se ha cargado en dicho registro. Muy diferente tipo de información que se da al compilador para dejar de muy diferentes tipos de optimizaciones no válidos.

Otros consejos

mutable: La palabra clave mutable anula cualquier declaración const encierra. Un miembro de mutable de un objeto const puede ser modificado.

volatile: La palabra clave volátil es un modificador dependiente de la implementación, que se utiliza cuando la declaración de variables, que impide que el compilador de optimización de esas variables. Volatile debe utilizarse con variables cuyo valor puede cambiar de manera inesperada (es decir, a través de una interrupción), que podrían entrar en conflicto con optimizaciones que el compilador podría realizar.

Fuente

Definitivamente NO son la misma cosa. mutables interactúa con const. Si usted tiene un puntero constante, normalmente no podría cambiar los miembros. Mutable proporciona una excepción a esa regla.

volátil, por el contrario, es totalmente ajeno a los cambios realizados por el programa. Esto significa que la memoria podría cambiar por razones ajenas a la voluntad del compilador, por lo tanto, el compilador tiene que leer o escribir la dirección de memoria cada vez y no se puede almacenar en caché el contenido en un registro.

Una forma cruda pero eficaz de pensamiento de la diferencia es:

  • El compilador sabe cuando un objeto mutable cambios.
  • El compilador no puede saber cuando un objeto volátil cambios.

A mutable variable de marcado permite para que pueda ser modificado en un método declarado const.

Una variable marcada volatile le dice al compilador que debe leer / escribir la variable cada vez que su código dice que también (es decir, que no puede optimizar la distancia accede a la variable).

Me gustaría añadir que volátil es también muy útil cuando se trata de aplicaciones de subprocesos múltiples, es decir, que tenga su hilo principal (donde main () vive) y generar un subproceso de trabajo que va a seguir girando mientras la variable "app_running" es verdad. main () controla si "app_running" es verdadera o falsa, por lo que si no se agrega el atributo volátil para la declaración de "app_running", si el compilador optimiza el acceso a "app_running" en el código corrió por el hilo secundario, principal ( ) podría cambiar "app_running" false pero la rosca secundaria seguirá funcionando debido a que el valor se ha almacenado en caché. He visto el mismo comportamiento con gcc en Linux y VisualC ++. Un atributo "volátil" poner en la declaración "app_running" resuelto el problema. Por lo tanto, este es el escenario donde no hay alarmas de proceso o núcleo se invoved en el cambio del valor de dichas variables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top