Pergunta

Gostaria de saber a diferença entre variáveis ​​estáticas e variáveis ​​globais em termos de velocidade de acesso e consumo de espaço.(Se quiser conhecer minha plataforma:compilador gcc no Windows.(Estou usando Cygwin com Triton IDE para programação embarcada ARM7 no Windows.Triton vem com compilador gcc na plataforma Java que pode ser executado no Windows.))

(Obviamente eu sei em termos de escopo de arquivo e função de essa questão)

Editar: OK, me dê uma resposta sobre qualquer ambiente de microcontrolador/processador.

Foi útil?

Solução

Não há diferença para o espaço, eles levam a mesma quantia.

Mas há uma diferença de velocidade:estático é mais rápido.

É claro que o acesso à memória para a variável é o mesmo para global e estático.Mas o compilador pode otimizar quando você tem estática.Quando compila um módulo, ele sabe que nenhuma chamada de função para uma função fora do módulo pode alterar uma variável estática.Portanto, ele sabe exatamente o que acontece e pode, por ex.mantenha-o em um registro durante as chamadas de função.Quando é global e você chama uma função de um módulo diferente, o compilador não consegue saber o que faz.Portanto, ele deve assumir que a função acessa a variável e a altera, resultando em um armazenamento e recarregamento.

Com o gcc você pode passar em tudo .c fontes ao mesmo tempo, para que também possa ver o que acontece nas chamadas de função para funções de módulos diferentes.Para fazer funcionar você tem que passar além de tudo .c arquivos de uma vez -combine e -fwhole-program.O -fwhole-program torna todos os globais estáticos (não o módulo estático, mas a unidade de compilação estática, ou seja,todo o dado .c arquivos juntos).O -combine faz a análise intermódulo.

Outras dicas

Consumo de espaço:basicamente nenhuma diferença.A única vez que haveria um problema de espaço é se você conseguir ocultar o mesmo pedaço de dados estáticos em N arquivos de objeto, obterá um fator de multiplicação de N, onde poderá ter apenas 1 cópia se for uma única peça global De dados.No entanto, esse é um problema de design incorreto.Ocultar informações é bom - a menos que as informações não devam ser ocultadas.

Velocidade de acesso:nenhuma diferença.

É difícil adivinhar ou estimar.Provavelmente levaria algum tempo, mas eu faria um projeto de amostra e testaria a velocidade.Testando velocidade de acesso e espaço com um loop.Teste o projeto de amostra com um emulador para essa arquitetura.

Eu esperaria que qualquer diferença viesse de problemas de empacotamento (para espaço) e cache (para velocidade).Ambos também podem surgir de praticamente qualquer outra coisa.

sem diferença no ambiente que você descreve quando se trata de espaço.A var estática ou global consome exatamente a mesma quantidade de memória.

Para velocidade considerações (mas não é uma boa prática) você poderia prefira vars globais, se você precisar de acesso ao var fora de um arquivo.(ref uso de external char my_global_char_placed_else_where;)

Para uma melhor prática, você usa funções get/set, mas elas são mais lentas.Então você poderia usar macros para obter/definir uma var que é global para ocultar do leitor do código que a var é de fato global, mas isso é como trapaça.Mas pode tornar o código mais legível.

Se você comparar ocultar um var dentro de uma função, então não há diferença em comparação com colocá-lo fora da função e mais funções poderiam ter acesso ao var.

Eu mesmo uso micros MSP430, ARM7 (apenas para testes) e AVR32 para desenvolvimento

O que Jonathan diz não é exatamente correto.Ambas as variáveis ​​estáticas e globais serão (devem ser) salvas nas regiões ZI (ou dados RW).O compilador não pode "mantê-lo" estritamente no registro - o que ele pode fazer é carregar o valor no registro, usar esse registro para todas as operações e salvar esse valor de volta - isso é uma otimização específica do compilador.E mesmo assim, não há razão para que o compilador não faça isso também para variáveis ​​globais:a menos, é claro, que você o torne volátil.Mas então, tecnicamente, você também pode tornar uma variável estática volátil, então, novamente, não há diferença.

Editar:ah, sim - espaço:nenhuma diferença.

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