reservadas - ¿Un compilador de C está obligado a recargar siempre el valor de const de la memoria?
palabras reservadas en c++ y su significado pdf (2)
Parece que su variable es realmente una constante (es decir, no cambia durante la ejecución del programa) con un valor desconocido para el compilador. Si este es el caso, puedes declararlo así:
extern const int variable;
(es decir, sin volatile
y sin un inicializador) y deje que el script del vinculador u otras herramientas configuren el valor correcto.
Se permitirá al compilador cargarlo y potencialmente dejarlo en un registro para siempre, pero no reemplazarlo por 0 o cualquier otro valor en el momento de la compilación.
Tengo una variable const
en mi programa de C incorporado. Se define e inicializa con 0
en el código del programa. Se coloca en un área especial de ROM a través de un script de vinculador. Se puede cambiar el contenido del área especial mediante un procedimiento de programación especial, pero no se puede cambiar durante la ejecución del programa principal.
La pregunta es si tengo que declarar la constante como volatile
. Si no está marcado como volatile
, ¿se permite al compilador reemplazar todas las referencias con 0
? ¿O está obligado a cargarlo al menos una vez durante la ejecución del programa?
Si se marca como volatile
el compilador está obligado a cargarlo desde la memoria cada vez que lo necesite.
Si no está marcado como volatile
, el compilador puede cargarlo una vez desde la memoria, almacenarlo en un registro y usar este registro en lugar de volver a cargarlo.
Un compilador que no optimiza puede hacer esto, pero también puede, estúpidamente, cargarlo cada vez. (Como no recargar es de hecho una optimización en sí misma).
Los compiladores que se optimizan pueden notar la const
y decidir que puede compilarse con su valor real, literal; hasta un punto donde la constante original no aparece en absoluto en la sección .data
de su programa. (O tal vez lo hace, pero nunca se "lee".)
Dado que cambia el valor en un script de vinculador, el compilador no puede "saber" que el valor se cambió después de compilar. En ese caso, use volatile
: la única manera de decirle al compilador que no confíe en que se conoce el valor al compilar.