Atribuição de memória de variáveis locais
Pergunta
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
Devemos lembrar que a memória só pode ser abordado em múltiplos da palavra tamanho.Uma palavra no nosso caso é 4 bytes, ou 32 bits.Portanto, nosso buffer de 5 bytes é realmente vai levar 8 bytes (2 palavras) de memória, e nosso buffer de 10 bytes é vai levar 12 bytes (3 palavras) de memória.É por isso que SP está sendo subtraído por 20.
Por que não é ceil((5+10)/4)*4=16?
Solução
Porque as variáveis individuais devem estar alinhadas.Com a fórmula proposta, você alinharia apenas a primeira variável na pilha, deixando as variáveis seguintes desalinhadas, o que é ruim para o desempenho.
Isso também é conhecido como "empacotamento" e pode ser feito em C/C++ com pragmas, mas só é útil em casos muito específicos e pode ser perigoso tanto para o desempenho quanto como causa de possíveis armadilhas de tempo de execução.Alguns processadores irão gerar falhas em acessos desalinhados em tempo de execução, o que irá travar seu programa.
Outras dicas
As variáveis na sua arquitetura são alinhadas individualmente.buffer1 é arredondado para 8 e buffer2 para 12, para que ambos os endereços iniciais sejam alinhados em 4 bytes.Então 8+12 = 20.