Um compilador C pode reorganizar variáveis de pilha?

Eu trabalhei em projetos de sistemas embarcados no passado, onde reorganizamos a ordem de declaração das variáveis de pilha para diminuir o tamanho do executável resultante. Por exemplo, se tivéssemos:

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

Reordenaríamos isso para:

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

Devido a problemas de alinhamento, o primeiro resultou em 12 bytes de espaço na pilha e o segundo resultou em apenas 8 bytes.

Esse comportamento padrão dos compiladores C é apenas uma falha do compilador que estávamos usando?

Parece-me que um compilador deve ser capaz de reordenar variáveis da pilha para favorecer um tamanho menor de executável, se assim o desejar. Foi-me sugerido que algum aspecto do padrão C evita isso, mas ainda não consegui encontrar uma fonte respeitável.

Como uma pergunta de bônus, isso também se aplica aos compiladores C ++?

Editar

Se a resposta for sim, os compiladores C / C ++ podem reorganizar as variáveis de pilha. Você pode dar um exemplo de um compilador que definitivamente faz isso? Eu gostaria de ver a documentação do compilador ou algo semelhante que faça isso.

Editar novamente

Obrigado a todos por sua ajuda. Para documentação, a melhor coisa que consegui encontrar é o papelAtribuição ideal de slot de pilha no GCC(pdf), de Naveen Sharma e Sanjiv Kumar Gupta, apresentado nos procedimentos da cúpula do GCC em 2003.

O projeto em questão aqui estava usando o compilador ADS para o desenvolvimento do ARM. É mencionado na documentação desse compilador que as declarações de pedidos, como eu mostrei, podem melhorar o desempenho e o tamanho da pilha, devido à maneira como a arquitetura do ARM-Thumb calcula os endereços no quadro de pilha local. Esse compilador não reorganizou automaticamente os locais para tirar proveito disso. O artigo aqui linkado diz que, a partir de 2003, o GCC também não reorganizou o quadro da pilha para melhorar a localidade de referência dos processadores ARM-Thumb, mas implica que você poderia.

Não consigo encontrar nada que definitivamente diga que isso já foi implementado no GCC, mas acho que este artigo conta como prova de que você está correto. Obrigado novamente.

questionAnswers(11)

yourAnswerToTheQuestion