Article image
Rodrigo Mecheri
Rodrigo Mecheri27/07/2023 09:18
Compartilhe

Heap, Stack, Atribuição por referência e por valor. O que é cada uma ?

  • #Python
  • #.NET C#
  • #Java

Heap e Stack são duas áreas de memória fundamentais no processo de alocação e gerenciamento de memória em programas de computador. Vamos explicar o que são cada uma delas e como ocorre a atribuição por referência e por valor em relação a essas estruturas de memória.

Stack (Pilha):

A stack é uma região de memória usada para armazenar dados temporários e informações de contexto relacionadas a cada chamada de função ou método em um programa. Cada vez que uma função ou método é chamado, um novo bloco de memória é alocado na stack para suas variáveis locais e parâmetros. Essa alocação é rápida, uma vez que basta mover um ponteiro para a stack para reservar espaço. Quando a função ou método retorna, o bloco de memória associado é desalocado e a stack é liberada para ser reutilizada. Isso implica que o tempo de vida das variáveis na stack é limitado ao escopo da função ou método em que estão definidas.

Heap (Monte):

O heap é outra região de memória usada para armazenar objetos mais complexos, como arrays e objetos criados a partir de classes. A alocação de memória no heap é mais flexível e permite que os objetos persistam mesmo após o término da função ou método que os criou. Os objetos no heap são alocados dinamicamente durante a execução do programa e permanecem na memória até que sejam explicitamente desalocados (o que é raro na maioria das linguagens de alto nível) ou coletados pelo mecanismo de garbage collector. O heap é compartilhado entre todos os threads do programa e, portanto, permite o compartilhamento de dados entre diferentes partes do código.

Atribuição por Referência e por Valor:

A atribuição por referência e por valor é uma distinção importante no contexto de objetos e tipos primitivos.

- Atribuição por Valor: Ocorre quando uma cópia direta do valor de uma variável é feita para outra variável. Isso é comum para tipos primitivos(boolean,char,byte,short,int,long,float,double). Quando você atribui uma variável a outra, o valor do tipo primitivo é copiado para a nova variável, e as duas variáveis são independentes, ou seja, alterar o valor de uma não afeta a outra.

- Atribuição por Referência: Ocorre quando uma variável não contém diretamente o valor do objeto, mas sim o endereço de memória onde o objeto está armazenado. Isso é comum para objetos alocados no heap. Quando você atribui uma variável de referência a outra, ambas as variáveis apontam para o mesmo objeto na memória. Portanto, alterar o objeto através de uma das variáveis afetará o objeto acessado através da outra variável, já que ambas estão "referenciando" o mesmo objeto.

image

Na imagem acima vemos claramente a diferença entre as saídas, enquanto uma é o valor da variável primitiva, a outra é o local que o objeto está alocado na memória.

image

Enquanto nessa imagem, vemos todos os conceitos apresentados acima funcionando juntos para a melhor alocação de memória.

Em resumo, a stack é usada para armazenar dados temporários e tem um tempo de vida limitado, enquanto o heap é usado para armazenar objetos mais complexos e tem um tempo de vida mais longo e flexível. A atribuição por valor copia diretamente o valor da variável, enquanto a atribuição por referência faz com que duas variáveis apontem para o mesmo objeto na memória. Compreender esses conceitos é fundamental para um bom gerenciamento de memória e evitar erros comuns em programas.

Compartilhe
Comentários (1)
Diogo Dantas
Diogo Dantas - 27/07/2023 11:40

Gostei da explicação, bem clara e objetiva!!