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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top