2011-06-17 17 views
40

¿Cómo el compilador (por ejemplo, GCC) asigna const y static const variable, como en, ¿dónde residiría? En memoria de datos o memoria de programa?Const vs Static Const

Respuesta

38

Depende de su sistema y de cómo usa la variable. Para static variables:

Caso 1: Nunca utiliza la variable y el compilador la descarta silenciosamente. Esto no puede suceder con las variables extern.

Caso 2: Utiliza la variable, pero nunca toma su dirección. El compilador convierte el uso de la variable en operandos inmediatos, como si fuera un #define o enum. El compilador aún puede convertir extern estático en operandos inmediatos, pero aún así debe encontrar una dirección para él.

Caso 3: Se utiliza la variable y toma su dirección, el compilador se ve obligado a buscar un lugar para ponerlo en el código objeto, tal y como si se tratara de extern.

En cuanto a memoria de "datos" frente a "programa", bueno, eso es muy específico para el sistema que está utilizando. En mi sistema Linux x64/ELF, probablemente será puesto en la sección .rodata, que va en el mismo segmento que el código (.text), pero un segmento diferente de las secciones de datos de lectura y escritura (.bss, .data). Mi sistema parece no crear un segmento separado para datos no ejecutables de solo lectura.

Adición: Tenga en cuenta que el comportamiento es diferente en C++. En C++, una variable const tiene un enlace interno por defecto, por lo que static const es redundante y extern const es necesario para obtener una constante con un enlace externo.

5

Dietrich ya ha explicado bien el caso de las variables static.

Para las variables locales, la implementación del compilador tiene varias opciones sobre dónde asignar una variable calificada const para la cual se toma la dirección. Puede o no estar asignado en la pila o en la memoria estática. Este es particularmente el caso para los literales compuestos calificados const. Las direcciones de dos literales de ese tipo que se declaran localmente en diferentes ámbitos se pueden plegar en uno y sus direcciones pueden ser iguales.