Estou bastante confiante de que as variáveis declaradas globalmente são alocadas (e inicializadas, se aplicável) na hora de início do programa.
int globalgarbage;
unsigned int anumber = 42;
Mas e quanto aos estáticos definidos em uma função?
void doSomething()
{
static bool globalish = true;
// ...
}
Quando é o espaço globalish
alocado? Estou adivinhando quando o programa começa. Mas ele também é inicializado? Ou é inicializado quando doSomething()
é chamado pela primeira vez?
Alguns verbos relevantes do padrão C ++:
fonte
If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration.
A memória para todas as variáveis estáticas é alocada no carregamento do programa. Mas as variáveis estáticas locais são criadas e inicializadas na primeira vez em que são usadas, não na inicialização do programa. Há algumas boas leituras sobre isso e estática em geral aqui . Em geral, acho que alguns desses problemas dependem da implementação, especialmente se você quiser saber onde essas coisas serão localizadas na memória.
fonte
O compilador irá alocar variável (s) estática (s) definida (s) em uma função
foo
no carregamento do programa, no entanto, o compilador também adicionará algumas instruções adicionais (código de máquina) à sua funçãofoo
para que na primeira vez que for invocado, este código adicional inicialize a variável estática ( por exemplo, invocando o construtor, se aplicável).@Adam: Esta injeção de código nos bastidores pelo compilador é a razão para o resultado que você viu.
fonte
Tento testar novamente o código de Adam Pierce e adicionei mais dois casos: variável estática na classe e tipo POD. Meu compilador é g ++ 4.8.1, no sistema operacional Windows (MinGW-32). O resultado é a variável estática na classe é tratada da mesma forma que a variável global. Seu construtor será chamado antes de entrar na função principal.
Conclusão (para g ++, ambiente Windows):
(1) : O estado correto deve ser: "antes que qualquer função da mesma unidade de tradução seja chamada". Porém, por simples, como no exemplo abaixo, então é a função principal .
inclui <iostream>
resultado:
Alguém testou em env Linux?
fonte
Variáveis estáticas são alocadas dentro de um segmento de código - elas fazem parte da imagem executável e, portanto, são mapeadas já inicializadas.
Variáveis estáticas dentro do escopo da função são tratadas da mesma forma, o escopo é puramente uma construção de nível de linguagem.
Por esse motivo, você tem a garantia de que uma variável estática será inicializada com 0 (a menos que você especifique outra coisa) em vez de um valor indefinido.
Existem algumas outras facetas da inicialização que você pode tirar vantagem - por exemplo, segmentos compartilhados permitem que diferentes instâncias do seu executável em execução ao mesmo tempo acessem as mesmas variáveis estáticas.
Em C ++ (com escopo global), objetos estáticos têm seus construtores chamados como parte da inicialização do programa, sob o controle da biblioteca C runtime. No Visual C ++, pelo menos a ordem em que os objetos são inicializados pode ser controlada pelo pragma init_seg .
fonte
Sim, ele é. Isso, entre outras coisas, permite inicializar estruturas de dados acessadas globalmente quando for apropriado, por exemplo, dentro de blocos try / catch. Por exemplo, em vez de
você pode escrever
e use-o dentro do bloco try / catch. Na primeira chamada, a variável será inicializada. Então, na primeira e nas próximas chamadas, seu valor será retornado (por referência).
fonte