Executando verificação de segurança...
6

Sabe o que é engraçado? Programadores que vão manipular a pilha no baixo nível sabem que elas não são bem pilhas. Eu sempre omito isso, mas é o contrário. Vai de cima para baixo, é uma pilha morcegando :D

A Stack é conhecida por sua alocação automática, já que, ela mesma faz alocação e também a desalocação

Eu posso ter dado a entender isso. Mas na verdade a alocação em si é fixa da pilha toda. Ela deixa você usar um espaço dela e volta atrás quando não precisa mais daquilo. De fato é automaticamente que isso acontece. Quando inicia um escopo que tem um frame um ponteiro (stack pointer) "sobe" (de verdade, desce, mas é mais fácil enxergar como subindo) na pilha, e quando não precisa mais esse ponteiro volta para o lugar original, marcando onde é o topo da pilha naquele momento (o tipo lógico, o físico é fixo - em tese também, mas naõ vamos complicar).

O primeiro código no exemplo entra na pulha se estiver em uma função. É raro usar for,a mas se for a alocação não é na pilha.

A liberação do espaço em cada frame é no fum da função. A desalocação da puilha como um todo é no fim do programa. Isso acontece em C e quase todas as outras linguagens. Alguém pdoe inventar alguma maluquice.

Após o térmido do programa a memória é sempre liberada pelo sistema operacional, não tem risco. Em tese se você sabe que o programa vai rodar por pouco tempo e aloca pouco dinamicamente, pode até nmão usar o free() que estará tudo bem. Mas pra que fazer isso? Até tem caso que faz sentio, mas não faça por preguiça, acostume-se fazer o mais certo.

O problema é que sem o free() enquanto executa vai acumulando e vai estourar a a RAM, vai ficar muito lento (vai para a memória virtual em disco (SSD)), até quebrar de vez em casos extremos.

O exemplo mostrado está ok, mas é óbvio que fazendo assim não tem como se enrolar, o problema que a alocação assim costuma ser na pilha mesmo, se usa a forma dinâmica onde aloca em um lugar e libera em outro, aí começa ficar difícil, por isso o GC é uma técnica mais fácil, apesar de conbrar um preço.

Saber essas coisas ajuda programar melhor qualquer coisa, mesm oque nunca use direrentamente. Desde que a pessoa estude do jeito certo, tem gente que não consegue fazer associações depois.

Ajudei? Era o meu desejo.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

Obrigado pelo crédito.

Ajudei? Era o meu desejo.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

Carregando publicação patrocinada...
5

Na verdade, a stack crescer para cima ou para baixo depende da ABI da arquitetura que está sendo usada. Nos nossos PCs usamos x86 que cresce para baixo, porém em um microcontrolador piccolo ela cresce para cima, por exemplo.

1

Tem isso mesmo, é que estou acostumado com isso e todo mundo meio que só fala assim na maioria dos círculos, mas é uma boa ressalva.

3

O que seria "cima" e "baixo"? Eu entendi que crescer para baixo significa que a stack começa em um endereço alto de memória e desce em direção a um endereço mais baixo.

Por exemplo, usando números totalmente fictícios apenas para entendimento: vamos supor que seja decrescente de 255 (0xFF) à 128 (0x80).

É isso?

4

Isso mesmo. E aí visualmente seria representado assim:

Pilha para baixo

Clar oque na memória não tem esse visual, é só para enteerdemos melhor.

Mas se representar para vcima dá na mesma. Se naõ tem enedereços de memória, não muda nada, e se tem é só colocar os endereço corretos, então se estiver crecendo para baixo em cima ser 2555 e embaixo será 128, mas se estiver crewcendo para cima, o topo será 128 e lá embaixo será 255.