2009-11-03 16 views
12

cuando se hace así:¿Cuánta memoria tiene una constante en C?

const int a = 5; 

Me pregunto si un obtendrán 4 bytes de memoria al igual que una variable? (En el sistema de 32 bits)

+0

si es global y nunca cambiará, Dale una mano al optimizador y hazlo 'static const int a = 5;' –

+0

"' const' "es una palabra clave con connotaciones erróneas. No crea un "const" en el significado del día a día: crea un viejo objeto normal antiguo en el que no se puede escribir. Estaría más feliz si la palabra clave para el concepto fuera "de solo lectura" cuando se introdujo en el idioma _no, no creo que sería bueno cambiarlo ** ahora ** _ – pmg

+0

Impar. No he usado C/C++ en mucho tiempo (.Net ahora), pero pensé que 'const int' era una adición de C++, y necesitabas' # define' en C. –

Respuesta

-1

Depende del compilador.

Por ejemplo:

const int a = 4; 

Esto podría ser manejado por el compilador de asignación de 4 bytes y simplemente hacer cumplir la inmutabilidad.

Si tuviera una cadena constante:

static final java.lang.String name = "Foobar"; 

El compilador podría eliminar la variable y sustituirla por la cadena real "Foobar" en todas partes se utiliza la variable. Esto no ocupa espacio del montón, pero todavía tiene que almacenarse en algún lugar del segmento de datos de programas. Java intenta hacer esto cuando encuentra una cadena entrecomillada que se usa en varios lugares, por lo que solo debe almacenar una copia de la misma.

De cualquier manera, las constantes no eliminan la asignación de almacenamiento. En el mejor de los casos, solo pueden minimizar el almacenamiento necesario.

+0

También creo que depende del compilador – root

1

Depende de su arquitectura, pero sí si haces algo const o no, no afecta realmente a su tamaño, pero más su ubicación en la memoria. Ahora, hay algunas optimizaciones del compilador que pueden cambiar lo que crees que realmente sucederá, pero esta es la idea básica.

13

Sí lo hará. Aunque si nunca toma su dirección, entonces el optimizador podría eliminarla por completo y simplemente reemplazar cualquier referencia a la constante con el número 5 en su caso.

+12

Los objetos constantes en C tienen un enlace externo por defecto. Por eso es difícil para el optimizador eliminarlos: tienen que exportarse desde el archivo objeto. Solo un optimizador global más avanzado puede hacerlo, así que no se sorprenda si no se elimina. En C, si desea una constante "extraíble", debe declararla como 'static 'explícitamente. – AnT

+0

Esto significa que el compilador probablemente * reemplazará * todas las referencias a la constante con literal '5', pero aún no tiene libertad inmediata para eliminar el objeto constante original de la memoria (a menos que tenga una manera de saber que efectivamente nunca referenciado en ninguna parte del programa). – AnT

+0

mientras está eliminado de la pila y el montón estará presente en el código de ensamblado (una o varias veces) si no se mezcla en tiempo de compilación con otra constante. –

0

Puede tomar la cantidad habitual, pero si solo la usa de forma que nunca requiera una dirección, el compilador/vinculador puede optimizarla para que no ocupe ningún tipo de memoria.

0

En general la constante tendrá el mismo espacio que una variable, por lo que si int es de 32 bits en su arquitectura, una tendrá 32 bits también. Sin embargo, el compilador también puede decidir poner directamente la constante en el código, sin asignar espacio para la constante en sí. Esto dependerá de dónde esté realmente definida la constante, es decir, si el compilador puede determinar que no hay posibilidad de modificar una (por ejemplo, a través de const) o tomar la dirección de a.

3

Depende.

const int a = 5; 

Tomará cuatro bytes de memoria (o cuantos bytes ocupará una int en su sistema).

Si usted lo hace estática:

static const int a = 5; 

A continuación, el optimizador es libre para reemplazar cada instancia de a con el valor de 5.El optimizador no puede hacer eso en el primer caso (no estático) simplemente porque es posible que se refieren a a en una unidad de compilación independiente con:

extern const int a; 
-1

En un sistema integrado, en memoria de sólo lectura es independiente de la memoria escribible , esta constante no ocupará RAM, se almacenará solo en ROM. Del mismo modo, en un sistema con memoria virtual, las constantes se cargarán en las páginas de memoria de solo lectura y solo ocuparán la RAM una vez, sin importar la cantidad de copias en ejecución del programa.

1

No hay diferencia en el consumo de memoria entre int a y const int a.

Sin embargo, tenga en cuenta que los objetos C declarados como const no forman expresiones constantes (a diferencia de C++) y tienen un enlace externo por defecto (a diferencia de C++, de nuevo). Todo esto significa que en C un objeto constante es más o menos lo mismo que un objeto no constante, simplemente no modificable.

Además, significa que en C un objeto constante tiene muy pocas posibilidades de ser "eliminado", como otras respuestas afirman que lo hará. Si realmente desea que sea "extraíble" en C, debe declararlo como static explícitamente. Pero incluso eso no hará que un objeto const int forme expresiones constantes, es decir, usted todavía no puede usarlo para designar el tamaño de la matriz en C89/90 y en C99 la matriz resultante sigue siendo una matriz de longitud variable (VLA).

0

una variable constante requiere 4 bytes de memoria, pero si se trata de un valor que requiere 0 bytes desde el código ensamblador se embeber el valor como esto

mov eax, 5

aquí 5 No te proviene de una variable pero es la constante 5, e incluso generará un código más rápido ya que no se requieren llamadas de memoria para recuperar el valor, es solo parte del código de ensamblaje

Cuestiones relacionadas