¿Puede un compilador de C reorganizar las variables de la pila?

He trabajado en proyectos para sistemas embebidos en el pasado donde hemos reorganizado el orden de declaración de las variables de la pila para disminuir el tamaño del ejecutable resultante. Por ejemplo, si tuviéramos:

void func()
{
    char c;
    int i;
    short s;
    ...
}

Reordenaríamos esto para que sea:

void func()
{
    int i;
    short s;
    char c;
    ...
}

Debido a problemas de alineación, el primero resultó en el uso de 12 bytes de espacio de pila y el segundo resultó en solo 8 bytes.

¿Es este comportamiento estándar para los compiladores de C o simplemente una deficiencia del compilador que estábamos usando?

Me parece que un compilador debería poder reordenar las variables de la pila para favorecer un tamaño ejecutable más pequeño si así lo desea. Se me ha sugerido que algún aspecto del estándar C evita esto, pero no he podido encontrar una fuente confiable de ninguna manera.

Como pregunta adicional, ¿esto también se aplica a los compiladores de C ++?

Editar

Si la respuesta es sí, los compiladores de C / C ++ pueden reorganizar las variables de la pila, ¿puede dar un ejemplo de un compilador que definitivamente hace esto? Me gustaría ver la documentación del compilador o algo similar que respalde esto.

Editar de nuevo

Gracias a todos por su ayuda. Para la documentación, lo mejor que he podido encontrar es el documentoAsignación óptima de ranuras de pila en GCC(pdf), por Naveen Sharma y Sanjiv Kumar Gupta, que se presentó en las actas de la cumbre del CCG en 2003.

El proyecto en cuestión aquí estaba usando el compilador ADS para el desarrollo de ARM. En la documentación de ese compilador se menciona que las declaraciones de pedidos como las que he mostrado pueden mejorar el rendimiento, así como el tamaño de la pila, debido a cómo la arquitectura ARM-Thumb calcula las direcciones en el marco de la pila local. Ese compilador no reorganizó automáticamente a los locales para aprovechar esto. El documento vinculado aquí dice que a partir de 2003 GCC tampoco reorganizó el marco de la pila para mejorar la localidad de referencia para los procesadores ARM-Thumb, pero implica que podría hacerlo.

No puedo encontrar nada que definitivamente diga que esto se implementó alguna vez en GCC, pero creo que este documento cuenta como prueba de que todos están en lo correcto. Gracias de nuevo.

Respuestas a la pregunta(11)

Su respuesta a la pregunta