Pergunta

Em C ++ memória a classe de armazenamento especificador estático aloca da área de dados. O que significa "área de dados" significa?

Foi útil?

Solução

Além do que Konrad disse, declarando uma variável como estático, basicamente, significa que a memória para ele é alocada com o programa como ele é carregado, em oposição a na pilha ou a pilha. Historicamente, usando apenas variáveis ??estáticas em um aplicações críticas significava que o consumo de memória do aplicativo não mudaria em tempo de execução e, portanto, era menos provável que falhar devido a limitações de recursos. Não sei se isso ainda é verdade para os sistemas operacionais modernos.

Se você receber o seu compilador para gerar um mapfile como parte de sua produção, você pode ter um olhar ver o que está em todas as várias secções, incluindo dados.

Outras dicas

Eu não estou familiarizado com o termo “área de dados” o mas a memória é frequentemente dividida em seção “código” e “seção de dados”. Código reside nas antigas, dados do último. Eu presumo que isso é o que significou aqui.

Classicamente, não há distinção entre os dois. No entanto, muitos sistemas operacionais modernos podem proibir a execução de código int ele segmento de dados (desde que a CPU suporta esta distinção). Isso às vezes leva o slogan de “flag NX”, como em “não execução” e pode efetivamente prevenir alguns casos de injeção de código malicioso.

/ EDIT:. Observe que o padrão C ++ não menciona uma “área de dados”

Os nomes das áreas variam de acordo com plataforma, compilador e vinculador.

Em geral, não são:

  • texto do programa:. O espaço de código executável
  • constantes:. Constantes de não-executáveis ??
  • pilha:. A pilha
  • BSS: em geral "estática" em termos de C / C ++. "Block Iniciado por Symbol"
  • Dados: globals uninitialised
  • pilha: Armazenamento alocado em tempo de execução
  • .

Neste caso, a documentação em questão está usando o nome de "área de dados" para o que é tradicionalmente chamado o segmento bss.

termos em C, a classe de armazenamento especificador significa "estáticos" de memória que existe para a vida do programa e é inicializado a zero ou o valor do initialiser. No exemplo:

static int s_value_one;
static int s_value_two = 123;

O valor da s_value_one é garantido para ser zero e o valor da s_value_type é 123 no ponto da primeira instrução no main (). Como isto vem a ser verdade é um problema de implementação.

O que disse Konrad.

Eu gostaria de acrescentar que ainda existem CPUs lá fora, que não podem ler dados se ele é colocado na seção de código e vice-versa. Estes têm sido décadas mais comuns atrás, mas eles ainda estão vivos no mundo incorporado.

Em poucas palavras o vinculador apenas grupos símbolos de igual juntos tipo. No PC muitas vezes você tem ainda mais do que áreas de código e de dados simples. Você vai encontrar áreas para dados não inicializados, ler apenas dados e outras OS coisas dependentes também.

Há muitos lugares que os dados pode acabar. Normalmente, as variáveis ??locais são alocados na pilha, e você pode alocar coisas na pilha usando malloc (ou versão padrão de de 'novo'). dados estáticos, no entanto, normalmente é alocado quando seus começos do programa, e pode acabar em qualquer lugar -. exatamente onde está até o compilador, OS, e formato executável

Executable tem lotes da informação nele.

Um executável, tem muitos tipos / classes de dados armazenados dentro de seu arquivo físico.

exemplo de são

  1. instruções de código executável
  2. Resources
  3. informações de dependência (quais DLLs este binário depende)
  4. Os símbolos que são exportados a partir deste binário

etc

É preciso haver alguma maneira de organizar

toda essa informação dentro do formato de arquivo .exe de tal forma que o sistema operacional pode facilmente encontrar todas as informações e carregar o executável e fazer as coisas funcionarem. Para este efeito, um formato binário comum (criado por M $ de curso) chamado PE (Portable Executable) é usado no mundo Windows. Toda a informação que acabei de listar (e muitos mais) são descritos em detalhes em diferentes seções do binário.

seção .data

Uma tal seção é a seção .data. A seção .data contém todos os dados globais e estáticos inicializados, enquanto a seção .bss contém os dados globais não inicializado.

Por que você precisa de uma seção separada para globals?

Bem, um se comporta globais como um global porque ele é criado em uma área de memória que existe para a vida inteira de um programa e não é uma estrutura de dados temporária como uma pilha que pode ser sobrescrita / reutilizados. (Como variáveis ??auto normais).

Compiler

Portanto, essas variáveis ??precisam ser alocados em algum endereço permanente no heap, que, infelizmente, não pode ser conhecido no momento da compilação. Assim, os lugares compilador todas as variáveis ??globais e estáticas neste .data seção / .bss, e as instruções que se referem a estas variáveis ??se referem a esses endereços relativamente permanentes na .data / .bss.

Linker

Quando as cargas vinculador o executável no mundo real, ele decide onde essas seções têm de ser colocados e cria UPs correção para esses endereços temporários de tal forma que as instruções que se refere aos globals se referem aos endereços agora verdadeiro virtuais nos programas memória.

Agora você sabe o que a secção / área .data é e porque as necessidades globais para ser alocado algum espaço nessa área e como isso ajuda o programa em tempo real. Pesquisando formato PE e vinculador e seção .data etc iria obter os links.

Eu acho que 'área de dados' está se referindo à pilha, enquanto que as variáveis ??locais normalmente seria localizado na pilha.

Ou isso significa que a memória alocada para esta variável está localizado na seção .data do executável, mas que seria específico para Windows e o formato PE.

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