2011-08-22 11 views
7

En un comentario a esta answer en the usage of Anonymous enum, Oli Charlesworth establece que:const int no ocupa espacio?

const int es inmutable, y puede que no ocupa espacio, dependiendo de lo que el compilador elige hacer.

Si Declaro const int i = 10, cómo se almacena 10 que si "puede no ocupa lugar"?

Suponiendo que un int tiene 4 bytes, supongo que se reservan al menos 4 bytes para almacenar 10 como const int.

+3

Toma espacio no importa qué.La pregunta es dónde. –

Respuesta

9

El compilador puede optimizar el código como lo considere oportuno, siempre que el código resultante ofrezca los mismos efectos secundarios observables.

Por lo tanto, las variables se pueden optimizar para que solo existan en los registros o se reemplacen por valores inmediatos. En pseudo-máquina-código:

SET 10, eax 
ST eax, &i # Initialise i 

... 

LD &i, eax # Add i to ebx 
ADD eax, ebx, ebx 

podría llegar a ser:

SET 10, eax 
ADD eax, ebx, ebx 

o incluso sólo:

ADD 10, ebx, ebx 
+0

Todavía no veo cómo puedes probar esto. ¿Hay alguna documentación del compilador que indique este tipo de optimizaciones? Si no, quiero saber cómo es que sabes que los compiladores conocen estas optimizaciones. Gracias por adelantado. – atoMerz

+0

@AtoMerZ: Una forma es simplemente mirar la salida del compilador (ejecutar 'objdump' o algo en el archivo del objeto o ejecutable). Otra es leer Wikipedia: http://en.wikipedia.org/wiki/Constant_folding. –

+0

Gracias de nuevo, el enlace ayudó. – atoMerz

2

Puede ser parte del código y se puede utilizar como un valor constante constante (como #define FIVE 5) por ejemplo.

3

compilador puede sustituir el número 10 cada vez que se necesita leer i, en lugar de leer el valor almacenado.

5

A menos que use i de una manera que requiera una dirección, el compilador generalmente solo la usará en tiempo de compilación, y en tiempo de ejecución, todo eso lo dejará en 10, no en una variable.

En particular, dado que const no cambia, no hay necesidad de almacenarlo realmente en la memoria a menos que haga algo como pasarlo a una función que toma un parámetro por referencia.

2

El compilador puede simplemente reemplazar todas las apariciones de i en su código por la constante 10. No i, por lo tanto, no requiere espacio, cuesta lo mismo (si el compilador no es tonto o ve que descarta la const) como el uso de números mágicos, solo hace que el código sea mucho más legible. Con pequeñas constantes, puede ser capaz de doblarlas en las instrucciones de ensamblaje.

3

Bueno, es un poco engañoso decir que tomará sin espacio, ya que el valor por supuesto permanecerá en el espacio de instrucciones en la memoria, pero no se asignará espacio para almacenar la variable como el tipo de datos en cuestión. Podría ser más apropiado decir que la cantidad mínima de memoria posible, que creo que es a lo que apunta su reacción.

0

Lo más probable es que ocupe espacio si lo declara en el espacio de nombres global. Si lo declaras en un cuerpo de función o lo declaras "estático" en alguna parte, el compilador puede quitarlo. Si lo declaras globalmente, el compilador no tiene forma de saber si se hace referencia a la constante desde otra unidad de traducción.

Cuestiones relacionadas