Memória Stack X Heap


A memória é dividida em 2 tipos: Stack e Heap, mas alguns livros dizem que existem 3 tipos: automática, estática e dinâmica.

A diferença básica entre esses tipos é nada mais que a forma como ele é tratado.

A Stack (ou Automática/Pilha) é onde guardamos as variáveis locais nos programas.

     - acesso muito mais rápido
     - não tem que se preocupar com a desalocação de variáveis
     - espaço é gerido de forma eficiente pela CPU, a memória não será fragmentada
     - somente variáveis locais
     - limita o tamanho da memória (dependente do SO)
     - variáveis não podem ser redimensionadas

Já a Heap (ou Estática) é assim chamada porque seus valores permanecem até o fim do programa.

Na memória Heap, por exemplo, guardamos variáveis globais, constantes e variáveis definidas "static" no C.

     - variáveis podem ser acessadas globalmente
     - não há limite para o tamanho da memória
     - acesso mais lento
     - a memória pode se fragmentar
     - você é o responsável pelo gerenciamento da memória
     - variáveis podem ser redimensionadas (realloc())

Por fim, toda a memória que não é estática nem automática é dinâmica. A memória dita dinâmica viria após a Heap.

A alocação da memória é sempre de cima pra baixo, dependendo da área que se vai utilizar. Vejamos uma figura de como ficaria essa divisão da memória:



Podemos usar isso pra compreender erros comuns como "Stack Overflow", que nada mais é do que "pilha sobrecarregada", ou seja, ela cresceu tanto que está invadindo uma área que originalmente não é dela.

Criando um objeto na Stack:


	#include <stdio.h>

	double multiplyByTwo (double input)
	{
		double twice = input * 2.0;
		return twice;
	}

	int main (int argc, char *argv[])
	{
		int age = 30;
		double salary = 12345.67;
		double myList[3] = {1.2, 2.3, 3.4};

		printf("double your salary is %.3f\n", multiplyByTwo(salary));

		return 0;
	}
Criando um objeto na Heap:

		
	#include <stdio.h>
	#include <stdlib.h>

	double *multiplyByTwo (double *input)
	{
		double *twice = malloc(sizeof(double));
		*twice = *input * 2.0;
		return twice;
	}

	int main (int argc, char *argv[])
	{
		int *age = malloc(sizeof(int));
		*age = 30;
		double *salary = malloc(sizeof(double));
		*salary = 12345.67;
		double *myList = malloc(3 * sizeof(double));
		myList[0] = 1.2;
		myList[1] = 2.3;
		myList[2] = 3.4;

		double *twiceSalary = multiplyByTwo(salary);

		printf("double your salary is %.3f\n", *twiceSalary);

		free(age);
		free(salary);
		free(myList);
		free(twiceSalary);

		return 0;
	}

Fontes:

http://www.vivaolinux.com.br/artigo/Funcionamento-da-memoria/
http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html




Comentários

Copyright © 2018 Anderson Bravo
www.andersonbravo.com.br
anderson@andersonbravo.com.br