Suponha isso:
void func()
{
...
if( blah )
{
int x;
}
...
}
O espaço x
reservado para a pilha é imediatamente func
inserido, ou apenas se o bloco for realmente executado?
Ou é a escolha do compilador?
C e C ++ se comportam da mesma maneira sobre isso?
c++
c
stack
allocation
Petruza
fonte
fonte
Respostas:
Quem disse que o compilador reservará qualquer espaço (poderia ser apenas um registro).
Isso é completamente indefinido.
Tudo o que você pode dizer é que (
x
) só pode ser acessado de dentro do bloco interno.A maneira como o compilador aloca memória (em uma pilha, se existir) é totalmente dependente do compilador (como a região da memória pode ser reutilizada para vários objetos (se o compilador puder provar que sua vida útil não se sobrepõe)).
Indeterminado.
Indeterminado.
Mas se
x
era um objeto de classe, o construtor só será executado se o bloco for inserido.O compilador pode nem mesmo alocar memória.
sim
fonte
Bem, é realmente a escolha do compilador, mas o que observei é que, quando compilo sem otimizações (o que geralmente fazemos para poder depurar nosso código), o compilador tende a fazer as coisas de maneira bastante clara. moda cortada, determinística e confiável:
O compilador não otimiza nenhuma variável local. (Exceto, talvez, variáveis explicitamente definidas como
register
, mas isso deve ser verificado.)O espaço de pilha para todas as variáveis locais, independentemente de como estão aninhadas, é reservado imediatamente quando a função é inserida.
O espaço da pilha não é reutilizado em escopos aninhados separados. Isso significa que
void f(){ { int x; } { int y; } }
alocará espaço para duasint
variáveis; o espaço alocado parax
o não ser reutilizado paray
.Obviamente, se você ativar otimizações, tudo o que Loki Astari escreveu na resposta aceita é verdadeiro.
fonte