¿Declaración de variables significa asignación de memoria?

¿Será preciso decir que en

void f() { int x; ... } 

int x; ” significa asignar bytes sizeof(int) en la stack?

¿Hay alguna especificación para eso?

Nada en los mandatos estándar que hay una stack. Y nada en los mandatos estándar que una variable local necesita memoria asignada para ello. La variable podría colocarse en un registro, o incluso eliminarse por completo como una optimización.

No hay ninguna especificación al respecto y su suposición es a menudo (pero no siempre) falsa. Considere algún código como

 void f() { int x; for (x=0; x<1000; x++) { // do something with x } // x is no more used here } 

Primero, un comstackdor de optimización pondría x dentro de algún registro de la máquina y no consumiría ninguna ubicación de stack (a menos que, por ejemplo, haga algo con la dirección &x como almacenarlo en un global).

También el comstackdor podría desenrollar ese bucle y eliminar x del código generado. Por ejemplo, muchos comstackdores reemplazarían

 for (x=0; x<5; x++) g(x); 

con el equivalente de

 g(0); g(1); g(2); g(3); g(4); 

y tal vez reemplazar

 for (x=0; x<10000; x++) t[x]=x; 

con algo como

 for (α = 0; α < 10000; α += 4) { t[α] = α; t[α+1] = α+1; t[α+2] = α+2; t[α+3] = α+3; }; 

donde α es una variable nueva (o quizás x sí).

Además, puede que no haya stack. Para C es poco común, pero algunos otros idiomas no tenían ninguna stack (ver, por ejemplo, el antiguo libro de A.Appel que comstack con continuaciones ).

Por cierto, si usa GCC , puede inspeccionar sus representaciones intermedias (Gimple) con, por ejemplo, la sonda MELT (o usar gcc -fdump-tree-all que produce cientos de archivos de volcado).

de GNU :

3.2.1 Asignación de memoria en progtwigs C

La asignación automática ocurre cuando declara una variable automática, como un argumento de función o una variable local. El espacio para una variable automática se asigna cuando se ingresa la statement compuesta que contiene la statement, y se libera cuando se sale de esa statement compuesta. En GNU C, el tamaño del almacenamiento automático puede ser una expresión que varía. En otras implementaciones de C, debe ser una constante.

Depende de mucho factor. El comstackdor puede optimizarlo y eliminarlo de la stack, manteniendo el valor en el registro. etc.

Si comstacks en depuración, ciertamente asigna algo de espacio en la stack, pero nunca se sabe. Esto no se especifica. Lo único que se especifica es la visibilidad de la variable y el tamaño y la aritmética en ella. Mira la especificación C99 para más información.