Pergunta

A memória global é inicializada em C++?E se sim, como?

(Segundo) esclarecimento:

Quando um programa é iniciado, o que há no espaço de memória que se tornará memória global, antes da inicialização dos primitivos?Estou tentando entender se está zerado, ou lixo por exemplo.

A situação é:uma referência singleton pode ser definida - por meio de um instance() chamada, antes de sua inicialização:

MySingleton* MySingleton::_instance = NULL;

e obter duas instâncias singleton como resultado?

Veja meu teste C++ em múltiplas instâncias de um singleton...

Foi útil?

Solução

Sim, as primitivas globais são inicializadas como NULL.

Exemplo:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

Você não pode fazer suposições sobre classes, estruturas, arrays, blocos de memória na pilha...

É mais seguro sempre inicializar tudo.

Outras dicas

Do padrão:

Objetos com duração de armazenamento estático (3.7.1) devem ser inicializados com zero (8.5) antes que qualquer outra inicialização ocorra.A inicialização zero e a inicialização com uma expressão constante são chamadas coletivamente inicialização estática;todas as outras inicializações são inicialização dinâmica.Objetos do tipo POD [plain old data] (3.9) com duração de armazenamento estático inicializados com expressões constantes (5.19) devem ser inicializados antes de qualquer inicialização dinâmica ocorrer.Objetos com duração de armazenamento estático definida no escopo do namespace na mesma unidade de tradução e inicializados dinamicamente devem ser inicializados na ordem em que sua definição aparece na unidade de tradução.[Nota: 8.5.1 descreve a ordem em que os membros agregados são inicializados.A inicialização dos objetos estáticos locais é descrita em 6.7.

Então, sim, os globais que possuem duração de armazenamento estático serão inicializados.É claro que os globais alocados, por exemplo, no heap não serão inicializados automaticamente.

Vindo do mundo incorporado...

Seu código é compilado em três tipos de memória:
1..dados:memória inicializada
2..texto:constantes e código
3..bss:memória não inicializada (inicializada como 0 em C++ se não for inicializada explicitamente)

Os globais entram em .data se inicializados.Caso contrário, eles serão colocados em .bss e zerados no código pré-principal.

Variáveis ​​declaradas com escopo estático/global são sempre inicializadas em VC++, pelo menos.

Sob algumas circunstâncias, pode realmente haver uma diferença de comportamento entre:

int x = 0;

int main() { ... }

e

int x;

int main() { ... }

Se você estiver usando segmentos de dados compartilhados, o VC++ usará pelo menos a presença de uma inicialização explícita junto com um #pragma data_seg para determinar se uma determinada variável deve ir no segmento de dados compartilhados ou no segmento de dados privados para um processo.

Para maior diversão, considere o que acontece se você tiver um objeto C++ estático com construtor/destruidor declarado em um segmento de dados compartilhado.O construtor/destruidor é chamado toda vez que o exe/dll é anexado ao segmento de dados, o que quase certamente não é o que você deseja.

Mais detalhes neste Artigo da base de conhecimento

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