¿Dónde se almacena una variable volátil en la memoria de programa almacenada (en qué sección)?Variable volátil
Respuesta
La volatilidad de una variable no cambia el lugar en el que se almacena una variable. Lo que cambia es la semántica sobre cómo se accede con respecto a las lecturas y escrituras.
No creo que el estándar C diga nada sobre la implementación de volátiles. Pero, por lo general, las garantías volátiles liberan semántica para operaciones de escritura en una variable y semántica de adquisición en operaciones de lectura de una variable. Sin embargo, esto no será cierto para todas las implementaciones y debería leer lo que su compilador específico garantiza
No hay razón para almacenar una variable volátil en ninguna sección "especial" de la memoria. Normalmente se almacena junto con otras variables, incluidas las no volátiles. Si algún compilador decide almacenar variables volátiles en alguna sección especial de la memoria, no hay nada que evite que lo haga. Pero a nivel de lenguaje no hay absolutamente ninguna razón para esto.
¿Por qué hace una pregunta? ¿Qué le hizo pensar que debería almacenarse en alguna sección especial de la memoria?
En C volatile
simplemente le dice al compilador: "No tiene suficiente conocimiento para suponer que el valor de esta variable no ha cambiado". No hay una "sección", por ejemplo, BSS, CSS para eso.
Considérelo una bandera para el compilador para evitar ciertos tipos de optimizaciones. Es muy útil en la programación integrada, donde la memoria en una determinada dirección puede "cambiar" debido a la entrada de un dispositivo de hardware.
Aquí hay una buena explicación: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658
Mientras se optimiza, ¿desde dónde el compilador obtendrá este valor supuesto? Me refiero a qué parte de la memoria? – kapilddit
Depende, generalmente el compilador "recuerda" que el valor está en un registro de la CPU. La volatilidad obliga al compilador a no hacer nunca esa suposición, y vuelve a cargar el valor de cada acceso (generalmente desde la memoria principal). – Justicle
volatile
no es un type qualifier un storage class specifier, por lo que no determina la ubicación de almacenamiento en absoluto; afecta la definición del tipo de una variable, no su almacenamiento.
Simplemente obliga al compilador para leer explícitamente una variable cuyo tipo es volatile
de ubicación de almacenamiento de la variable (sea donde sea) en lugar de asumir que un cierto valor leído previamente en un registro, por ejemplo, sigue siendo válida.
volátil no tiene nada que ver con la clase de almacenamiento.
volátil solo le dice al compilador u obliga al compilador a "no hacer la optimización" para esa variable. para que el compilador no optimice el código para esa variable y lea el valor de la ubicación especificada, no a través del registro interal que contiene el valor anterior.
Por lo tanto, al declarar la variable como volátil ... da garantía de que obtendrá el último valor, que puede ser alterado por un evento externo.
su código puede funcionar bien si no ha declarado que la variable es volátil, pero puede existir la posibilidad de no obtener el valor correcto a veces .. para evitar eso debemos declarar la variable como volátil.
volátil generalmente se usa cuando se trata de eventos externos, como interrupciones de pines relacionados con el hardware.
ejemplo. leyendo valores de adc.
const voltile means no puede modificar o alterar el valor de esa variable en el código. solo evento externo puede cambiar el valor.
Los pines del controlador generalmente se definen como volátiles. puede ser al declarar variable ya que el controlador volátil hará "leer por pin" no "leer por bloqueo" ... esta es mi suposición. puede estar equivocado ...
pero todavía hay mucha confusión al elegir variable como volátil ..
Una variable debe declararse volátiles siempre que su valor podría cambiar de forma inesperada. En la práctica, sólo tres tipos de variables podrían cambiar:
registros periféricos de memoria mapeada
Las variables globales modificados por un servicio de rutina de interrupción
Las variables globales dentro de una aplicación multi-hilo
Enlace: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
Por lo tanto, se ofrece a la variable como volátil en tales casos.
"Volátil" se usó en las especificaciones C/C++ para permitir el uso de dispositivos mapeados en memoria. Dirige el compilador para que no optimice la variable definida con esta palabra clave, simplemente porque la variable no parece cambiar su estado en el código visible del compilador.
- 1. ¿Debo sincronizar una variable volátil estática?
- 2. es una variable volátil sincronizada? (java)
- 3. Si declaro una variable de instancia como volátil, ¿el objeto de esta clase será volátil?
- 4. ¿Puede la variable volátil definirse como estática en Java?
- 5. ¿Qué ocurre después de escribir en una variable volátil?
- 6. ¿Tiene Delphi algún equivalente a la variable volátil de C?
- 7. Enclavado y volátil
- 8. ¿Dónde usar volátil?
- 9. sobrecarga volátil?
- 10. DateTime volátil
- 11. volátil y Thread.MemoryBarrier en C#
- 12. Visual C++ Volátil
- 13. Java volátil pregunta variables
- 14. ¿Cómo funciona realmente el volátil?
- 15. C++ variables de subprocesamiento volátil
- 16. C++ funciones de miembro volátil
- 17. Volátil con sincronizados juntos
- 18. Android volátil no funciona?
- 19. equivalente volátil en VB.NET
- 20. Semántica volátil en C99
- 21. puntero volátil y const
- 22. matriz volátil Java?
- 23. ¿Es necesario volátil aquí?
- 24. Boolean volátil vs AtomicBoolean
- 25. Modificador volátil Java y bloques sincronizados
- 26. Pregunta sobre la palabra clave volátil
- 27. ¿Volátil o sincronizado para el tipo primitivo?
- 28. ¿Por qué 'esto' no es volátil?
- 29. Uso apropiado de volátil sig_atomic_t
- 30. ¿Qué significa while (! Volátil); ¿hacer?
no, NO da esa semántica ver [esto] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html) y [CERT] (https : //www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive) diciendo 'no use 'volátil' para la sincronización' – Spudd86