Const vs Static Const

¿Cómo el comstackdor (por ejemplo, GCC) asigna const y static const variable, como en, donde residiría? ¿En memoria de datos o memoria de progtwig?

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

Caso 1: nunca usas la variable, y el comstackdor la descarta silenciosamente. Esto no puede suceder con variables extern .

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

Caso 3: utiliza la variable y toma su dirección, el comstackdor se ve obligado a buscar un lugar para colocarlo en el código del objeto, exactamente como si fuera extern .

En cuanto a la memoria de “datos” frente a “progtwig”, bueno, eso es muy específico del sistema que está utilizando. En mi sistema Linux x64 / ELF, probablemente se coloque 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-escritura ( .bss , .data ). Mi sistema parece no crear un segmento separado para datos no ejecutables de solo lectura.

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

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

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