¿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
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.
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.
- 1. PHP5: const vs static
- 2. static const + const como una matriz ligada
- 3. const vs new const
- 4. C++, donde inicializar static const
- 5. static assert for const variables?
- 6. semántica C++ de `const` estática vs` const`
- 7. Diferencia entre static const char * y const char *
- 8. Cómo crear una matriz de static const const char *
- 9. Declarar cadenas public static readonly versus public const versus public static const
- 10. estática const vs #define
- 11. Objetivo C const NSString * vs NSString * const
- 12. const char * miVar vs const char miVar []
- 13. Static solo contrasta const - diferentes conjuntos POV?
- 14. const vs estática en PHP
- 15. Corrección de const: const char const * const GetName const (// stuff);
- 16. int vs const int &
- 17. const string vs. #define
- 18. funciones estáticas vs funciones const
- 19. función virtual const vs función virtual no const
- 20. const CFoo & bar() const
- 21. const int = int const?
- 22. "extern const" vs "extern" only
- 23. const vs enum en D
- 24. const vs NSStrings estáticos en Objective-C
- 25. #define MY_INT VS const int MY_INT
- 26. ¿Es "const LPVOID" equivalente a "void * const"?
- 27. referencia a un NSString * static const de otra clase
- 28. `static`,` extern`, `const` en el archivo de cabecera
- 29. ¿Cuál es la diferencia entre Const y Static en C#?
- 30. const char * a const std :: string &