Sobes.tech
Junior

Como são utilizados a pilha e o heap na memória?

sobes.tech IA

Resposta da IA

A pilha é usada para armazenar variáveis locais, parâmetros de funções e endereços de retorno. A memória é alocada e libertada automaticamente, seguindo o princípio LIFO (Last-In, First-Out).

O heap é usado para alocação dinâmica de memória para objetos cujo tamanho é desconhecido durante a compilação ou cuja duração de vida excede o âmbito em que são criados. A gestão de memória no heap é feita manualmente ou através de mecanismos de gestão de memória (ARC em Swift, recolha de lixo em outras linguagens).

Característica Pilha Heap
Alocação Automática Dinâmica (manual ou com MRC/ARC)
Libertação Automática ao sair do âmbito Manual (free) ou com MRC/ARC
Tamanho dos dados Conhecido em tempo de compilação Pode ser desconhecido até à execução
Acesso Rápido, sequencial Mais lento, aleatório
Estrutura LIFO Grafo de objetos
Exemplos Variáveis locais, parâmetros de funções Objetos de classes, estruturas de tamanho variável
// Exemplo de uso de pilha e heap em Swift

func myFunction() {
    // Variável local na pilha
    var stackVariable: Int = 10

    // Objeto de classe no heap
    let heapObject = MyClass()

    // Tipo de valor na pilha (exceto estruturas que contêm tipos referenciados)
    var stackStruct = MyStruct()

    // Estrutura que contém um tipo referenciado, parte pode estar no heap
    var mixedStruct = MyMixedStruct()
}

class MyClass {
    // As propriedades do objeto são armazenadas no heap
    var property: String = "Hello"
}

struct MyStruct {
    // As propriedades de tipo valor são armazenadas na pilha
    var property: Int = 20
}

class MyReferenceType {
    var value: Int = 30
}

struct MyMixedStruct {
    // Tipo de valor na pilha
    var stackProperty: Int = 40
    // Tipo referenciado no heap (a própria referência na pilha)
    var heapReference: MyReferenceType = MyReferenceType()
}