¿Por qué el estándar C deja el uso de variables indeterminadas sin definir?

¿Dónde se almacena el valor de la basura y con qué propósito?

C elige no inicializar las variables a algún valor automático por razones de eficiencia. Para poder inicializar estos datos, se deben agregar instrucciones. Aquí hay un ejemplo:

int main(int argc, const char *argv[]) { int x; return x; } 

genera:

 pushl %ebp movl %esp, %ebp subl $16, %esp movl -4(%ebp), %eax leave ret 

Mientras este código:

 int main(int argc, const char *argv[]) { int x=1; return x; } 

genera:

 pushl %ebp movl %esp, %ebp subl $16, %esp movl $1, -4(%ebp) movl -4(%ebp), %eax leave ret 

Como puede ver, se utiliza una instrucción adicional completa para mover 1 a x. Esto solía importar, y todavía lo hace en los sistemas integrados.

IIRC, Thompson o Richie hicieron una entrevista hace algunos años donde dijeron que la definición del lenguaje a propósito dejaba las cosas vagas en algunos lugares, por lo que los implementadores en plataformas específicas tenían margen para hacer cosas que tuvieran sentido (ciclos, memoria, etc.) en esa plataforma . Lo siento, no tengo una referencia para enlazar.

Los valores de basura no se almacenan realmente en ninguna parte. De hecho, los valores de basura no existen realmente, en lo que respecta al lenguaje abstracto.

Verá, para generar el código más eficiente no es suficiente para que el comstackdor funcione en términos de vida útil de los objetos (variables). Para generar el código más eficiente, el comstackdor debe operar a un nivel mucho más fino: debe “pensar” en términos de vida útil de los valores . Esto es absolutamente necesario para realizar una progtwigción eficiente de los registros de la CPU, por ejemplo.

El lenguaje abstracto no tiene un concepto como “vida de valor”. Sin embargo, los autores de idiomas reconocen la importancia de ese concepto para los comstackdores que optimizan. Para dar a los comstackdores la libertad suficiente para realizar optimizaciones eficientes, el lenguaje se especifica intencionalmente para que no interfiera con optimizaciones importantes. Aquí es donde los “valores de basura” entran en escena. El idioma no indica que los valores de basura se almacenen en cualquier lugar, el idioma no garantiza que los valores de basura sean estables (es decir, los bashs repetidos de leer la misma variable sin inicializar podrían fácilmente dar como resultado “valores de basura” diferentes). Esto se hace específicamente para permitir que los comstackdores optimizados implementen el concepto vital de “vida útil de valor” y, por lo tanto, realicen una manipulación de variables más eficiente de lo que sería dictado por el concepto de lenguaje de “vida útil del objeto”.

C fue diseñado para ser un lenguaje de nivel relativamente bajo de modo que se pudiera usar para escribir, bueno, cosas de bajo nivel como los sistemas operativos. (de hecho, se diseñó para que UNIX pudiera escribirse en C) Simplemente puede pensar en él como un código de ensamblaje con una syntax legible y construcciones de alto nivel. Por esta razón, C (optimizaciones menos) hace exactamente lo que usted pide que haga, nada más, nada menos.

Cuando escribes int x; , el comstackdor simplemente asigna memoria para el entero. Nunca le pidió que guardara nada allí, así que todo lo que estaba en esa ubicación cuando comenzó su progtwig se mantiene como tal. La mayoría de las veces, resulta que el valor preexistente es “basura”.

A veces, un progtwig externo (por ejemplo, un controlador de dispositivo) puede escribir en algunas de sus variables, por lo que no es necesario agregar otra instrucción para inicializar dichas variables.

¿Por qué el estándar C deja el uso de variables indeterminadas sin definir?

No es asi:

  • para las variables locales, dice comportamiento indefinido, lo que significa que cualquier cosa (por ejemplo, segfault, borrar su disco duro) es legal: (¿Por qué) está utilizando un comportamiento indefinido de variable no inicializada?

  • para las variables globales, las pone a cero: ¿Qué sucede con una variable declarada, sin inicializar en C? ¿Tiene un valor?