durante o processo de desenvolvimento de software nós trabalhamos com variáveis com chamadas de métodos construções desses métodos passar variáveis dentro dos métodos também isso tudo é Um fundamento muito básico para quem tá começando a programar mas ao longo da nossa carreira muitas vezes a gente vai fazendo esses desenvolvimentos e não se atentando muito a como que um Framework ou como que aquele aquela linguagem de programação que você utiliza no dia a dia ela faz ali a locação de memória a locação de memória no processo de desenvolvimento de software ela é muito importante e é muito
importante também que o desenvolvedor entenda Quais são as memórias e também como que essas alocações são feitas porque pensando em performance Esse é um tema extremamente crítico a gente vai falar e vai ver um pouquinho aqui sobre fundamentos da memória stack que é uma memória principalmente no dnet ali que é uma memória muito importante e tem algumas certas limitações que eu vou mostrar para vocês agora apenas dando aqui um overview sobre o que que é a memória stack ela é um bloco de memória que é utilizado ali na sua grande conjunção para chamar métodos e
guardar essas variáveis Então pensa na memória stack visualiza ela como se ela fosse um monte de prato e aí a cada vez que você utiliza ali aquele prato você precisa de mais espaço e você vai colocar um prato em cima do outro um conceito de fila praticamente então imagine aqui que a memória stack ela tem ali vai criando uma pilha e essa pilha vai crescendo e crescendo e crescendo até uma hora que essa pilha não tem mais Onde colocar um novo prato fazer uma uma analogia aqui brevemente basicamente mas a memória steack ela é uma
memória que serve para isso basicamente Ela guarda ali as suas variáveis e tudo mais e também é interessante falar que essas variáveis que estão compostas dentro de métodos né imagina o método ali get user by ID no csharp onde você vai criar o método para passar um id e você vai chamar esse ID num banco de dados ali num SQL alguma coisa do tipo Então esse ID que você tá passando ali na composição né para dentro daquele método ele vai ser guardado né Essa variável temporária ali vai ser guardada na stack juntamente com a referência
como se fosse um ponteiro para esse método e para essas variáveis e o escopo das variáveis também que estão dentro desses métodos eles também vão ter um ciclo de vida menor al ali do que normalmente teria se fosse um outro tipo de memória Então o que eu tô falando aqui por exemplo imagina esse exemplo aqui que a gente tem que é uma classe pública estática que é para desenhar uma linha ou várias linhas aqui eu tô passando X1 y1 X2 Y2 então ali basicamente essa esses essas variáveis que estão compostas aqui dentro e todos esses
valores e todas as referências e todos esses tipos vão ser guardados ali dentro da memória stack para que o próprio gerenciador ali consiga entender Quem que tá sendo alocado o quanto de espaço que está sendo alocado e só lembrando também uma coisa muito importante a memória stack ela é uma memória que ela tem não tem muito espaço então é uma memória que a gente tem que guardar com muito carinho ali também na teoria o que eu quero dizer é isso a gente começa com um stack sem nada então basicamente quando o seu software vai fazer
o War up Ali vai começar né vai dar um start no seu software imagina que você tá fazendo uma API com dnet Core por exemplo então a steack vai est vazia e a cada chamada de método criação de variável passagem de variáveis também para dentro desses métodos ele vai dando um push ali dentro dessa memória e aí isso vai acontecendo vai acontecendo vai acontecendo e esse ciclo de memória ele é gerenciado pelo próprio Framework do dnet só que existem alguns casos que às vezes por Acidente eh ou por vez talvez você faz um método cíclico
ali que fica o próprio método chamando o próprio método né esse é o caso mais comum que a gente vê nos projetos reais isso uma hora você pode acabar não tendo mais espaço ali para dar push nessa memória nesse espaço de memória e aí vai acontecer aquele famoso stack overflow ou seja a gente não tem mais espaço em memória e aí vai dar um overflow na memória e simplesmente seu software vai receber ali uma parada brup vamos falar dessa forma e vai parar de funcionar porque não tem mais espaço n stec então se você tentar
colocar fazer uma locação de uma nova variável fazer uma chamada de um método não vai funcionar E aí vamos dar um exemplo clássico disso com o código de exemplo aqui então eu tenho aqui visual Studio 2022 basicamente eu criei aqui um projeto esse projeto nós vamos usar ao longo das aulas aqui vamos criando novas estruturas e tudo mais mas aqui eu tenho uma classe chamada drawline que é aquela classe que eu acabei de mostrar para vocês ali naquele exemplo então o drawline aqui eu vou passar uma variável um X1 um y1 um X2 um Y2
São todos da tipagem inteiro e aí e dentro dessa mesma classe eu vou chamar ela de forma cíclica Então essa classe ela vai ficar chamando ela mesma aqui no loop eterno e aí como ela faz muita locação de variáveis e o próprio método tá chamando esse próprio método foi um bom exemplo aqui pra gente ver esse tipo de alocação de memória na stack isso aqui eu venho aqui no programa.cs então basicamente o exemplo que nós vamos dar aqui da memória steack dessa locação a gente vai fazer um console right line esse console P artline aqui
ele vai subjetivamente aqui desenhar quatro linhas né com seus tamanhos e as suas larguras aqui e aí no final ele deveria falar pra gente que o desenho foi feito só que a gente aqui propositalmente colocou um código desse que fica chamando o próprio método então ele nunca vai acabar Isso aqui vai ficar chamando e chamando e chamando até que uma hora vai dar um problema Esse problema nós vamos ver agora né que é o famoso stack overflow que todo mundo conhece vou dar o play aqui nesse projeto Lembrando que eu tô usando aqui dnet 8
se você for fazer esse mesmo tipo de implementação e olha só o que foi esperado né Ou seja a gente teve um problema realmente teve aqui um System pstack overflow Exception né tá falando aqui pra gente basicamente Olha eu não tô conseguindo mais eu não tenho mais espaço disponível na stack porque você fez algum código aí aqui a gente fez uma forma proposital obviamente mas Olha o códo tá falando eu não tenho mais onde alocar aqui para você porque você chamou muitas vezes aqui e alocou muita coisa na memória stack e esse erro é um
erro padrão né até temos um site bem famoso que todo mundo conhece que tem esse próprio nome aqui stack overflow então dessa forma é uma forma que a gente consegue entender né Que tipo de alocação que a gente tá sendo feito aqui a gente tá passando bastante eh variáveis bastante tipagem e aí uma coisa que é cara também é esse próprio método né lá na stack ele coloca ele faz uma alocação de um ponteiro e esse ponteiro tem que entender para onde que aquela chamada desse método nesse caso tá indo então ele tá criando ponteiros
gravando a referência dessas dessas informações gravando o valor e a tipagem dessas variáveis que estão sendo passadas aqui também dentro aqui se eu tivesse outras variáveis ele também é salvar temporariamente essas variáveis aqui e tudo mais né Eh nesse caso aqui se eu tivesse também classes né que é o que a gente vai falar mais paraa frente sobre outro tipo de memória mas se eu tivesse classes aqui sendo utilizadas representadas aí eu tenho além da memória stack Eu tenho uma outra alocação também que é a memória hiip né então tem essa distinção e tem essa
junção às vezes às vezes eu faço a locação de memória onde eu tenho alguns momentos que eu tenho memória hiip e memória steack sendo alocada do mesmo jeito e a gente precisa entender isso é fundamento e a gente precisa entender correto então basicamente um resumo aqui da memória stack ela observa e armazena as chamadas dos métodos ela contém frames que guarda esses parâmetros então cada push né Cada vez que a gente faz uma chamada de um método por exemplo passando ali eh qual que é o método Quais são as variáveis Quais são as tipagens é
um frame novo então é aquele pratinho que a gente fez essa essa analogia E aí eu vou colocando um novo pratinho ele vai salvar para mim qual é o método Quais são as variáveis eh se eu tiver algum tipo de alocação também na na outra memória que a gente vai falar um pouco mais paraa frente ele também cria uma referência para lá endereço de retorno variáveis locais Então veja é uma memória limitada mesmo porque ela é uma memória mais rápida el uma memória que você consegue trabalhar com dados de forma muito mais rápida e o
stack frame que eu acabei de falar ele é removido quando retorna também uma chamada de um método por exemplo E aí as suas variáveis locais vão ficar obsoletas Então imagina você criar um novo método passar as variáveis ali dentro você criou algumas variáveis para fazer um cálculo imagina uma calculadora calcule dois valores né você passou para dentro desse método ali dentro você tem uma variável que faz a soma e faz um return para você então depois que isso daí já acabou e retornou para quem chamou aquelas variáveis aquele método vai ficar obsoleta ou fora de
escopo como a gente diz e se for executado esse método que nem a gente viu aqui diversas vezes principalmente de uma forma recursiva ou às vezes até dentro de um código ali de alguma forma errada dentro de um de um for com milhões de interações a stack vai ficar cheia e a gente vai receber o famoso stack overflow exception