Sobes.tech
Junior

Come vengono utilizzati lo stack e l'heap in memoria?

sobes.tech AI

Risposta dell'AI

Lo stack viene utilizzato per memorizzare variabili locali, parametri di funzioni e indirizzi di ritorno. La memoria viene allocata e liberata automaticamente secondo il principio LIFO (Last-In, First-Out).

L'heap viene utilizzato per allocare dinamicamente memoria per oggetti di cui si ignora la dimensione durante la compilazione o la cui durata di vita supera il contesto in cui sono creati. La gestione della memoria sull'heap avviene manualmente o tramite meccanismi di gestione della memoria (ARC in Swift, garbage collector in altri linguaggi).

Caratteristica Stack Heap
Allocazione Automatica Dinamica (manuale o con MRC/ARC)
Rilascio Automatico all'uscita dal scope Manuale (free) o con MRC/ARC
Dimensione dati Conosciuta in fase di compilazione Può essere sconosciuta fino all'esecuzione
Accesso Veloce, sequenziale Più lento, casuale
Struttura LIFO Grafo di oggetti
Esempi Variabili locali, parametri di funzioni Oggetti di classi, strutture di dimensione variabile
// Esempio di utilizzo di stack e heap in Swift

func myFunction() {
    // Variabile locale nello stack
    var stackVariable: Int = 10

    // Oggetto di classe sull'heap
    let heapObject = MyClass()

    // Tipo di valore nello stack (eccetto strutture che contengono tipi di riferimento)
    var stackStruct = MyStruct()

    // Struttura che contiene un tipo di riferimento, parte può essere sull'heap
    var mixedStruct = MyMixedStruct()
}

class MyClass {
    // Le proprietà dell'oggetto sono memorizzate sull'heap
    var property: String = "Hello"
}

struct MyStruct {
    // Le proprietà di tipo valore sono memorizzate nello stack
    var property: Int = 20
}

class MyReferenceType {
    var value: Int = 30
}

struct MyMixedStruct {
    // Tipo di valore nello stack
    var stackProperty: Int = 40
    // Tipo di riferimento sull'heap (la stessa referenza nello stack)
    var heapReference: MyReferenceType = MyReferenceType()
}