Non intendo il "come sono implementate" quello lo so bene, ma più che altro qual'è l'utilizzo che ne fa un linguaggio di programmazione generico? Tipo C o Java?
Servono per l'allocazione della memoria, lo stack viene usato per le variabili automatiche(all'interno di blocchi come le funzioni) te allochi una variabile? bene 4 byte allocati in stack e così via, finita la funzione si elimina la porzione di stack relativa al blocco(attraverso appunto il comportamento FIFO(First In First Out) che rispecchia completamente il comportamento dei blocchi, un blocco più esterno non termina prima di uno più interno esattamente come il comportamento FIFO non prevede che variabili allocate prima vengano deallocate di variabili più recenti)
L'heap invece mantiene le variabili, si crea all'inizio del programma e si elimina al suo termine viene usata per le variabili dinamiche(ma anche per le variabili statiche), vuoi allocare una nuova variabile? funzione new() e ti viene inserito un nuovo elemento nelle heap, funzione delete() e lo rielimini oppure per le statiche ci pensa il programma da solo
Sono due metodi differenti per avere vantaggi differenti, il primo utilizza un comportamento FIFO, come una pila di piatti, quindi come vedi eliminare tutte le variabili di una funzione è relativamente semplice
Il secondo invece ti permette una gestione dinamica delle tue variabili, potendo aggiungerne di nuove e toglierle, perchè un heap? Uno poteva usare un normalissimo array mentre l'heap è un albero binario, perchè l'heap grazie alle sue caratteristiche(la radice è maggiore dei figli ed è un albero binario quasi bilanciato con l'ultimo livello posto a sinistra) può essere mantenuto in un array senza perdere le qualità dello heap(i figli stanno sempre in posizione 2*i+1 e 2*i+2 rispetto al padre in posizione i) però l'heap ti permette anche una ricerca migliore rispetto ad un array(non ordinato), mentre se avessimo un array ordinato avremmo un costo molto più alto per mantenere l'ordine delle variabili(ogni volta che ne inserisci una nuova dovresti riordinarlo tutto con l'heap questo non succede) quindi l'heap si presta bene, in quanto non ha una ricerca "ottima" però nemmeno la peggiore e non si deve subire gli svantaggi di mantenersi ordinato per avere una ricerca efficiente(mantenere ordinato un heap è relativamente semplice, basta una funzione logaritmica(funzione down e up) per gestire gli ingressi e le uscite dei valori con un array ordinato invece devi letteralmente ricorstruire tutto l'array ogni volta che inserisci o elimini un valore)
Answers & Comments
Verified answer
Servono per l'allocazione della memoria, lo stack viene usato per le variabili automatiche(all'interno di blocchi come le funzioni) te allochi una variabile? bene 4 byte allocati in stack e così via, finita la funzione si elimina la porzione di stack relativa al blocco(attraverso appunto il comportamento FIFO(First In First Out) che rispecchia completamente il comportamento dei blocchi, un blocco più esterno non termina prima di uno più interno esattamente come il comportamento FIFO non prevede che variabili allocate prima vengano deallocate di variabili più recenti)
L'heap invece mantiene le variabili, si crea all'inizio del programma e si elimina al suo termine viene usata per le variabili dinamiche(ma anche per le variabili statiche), vuoi allocare una nuova variabile? funzione new() e ti viene inserito un nuovo elemento nelle heap, funzione delete() e lo rielimini oppure per le statiche ci pensa il programma da solo
Sono due metodi differenti per avere vantaggi differenti, il primo utilizza un comportamento FIFO, come una pila di piatti, quindi come vedi eliminare tutte le variabili di una funzione è relativamente semplice
Il secondo invece ti permette una gestione dinamica delle tue variabili, potendo aggiungerne di nuove e toglierle, perchè un heap? Uno poteva usare un normalissimo array mentre l'heap è un albero binario, perchè l'heap grazie alle sue caratteristiche(la radice è maggiore dei figli ed è un albero binario quasi bilanciato con l'ultimo livello posto a sinistra) può essere mantenuto in un array senza perdere le qualità dello heap(i figli stanno sempre in posizione 2*i+1 e 2*i+2 rispetto al padre in posizione i) però l'heap ti permette anche una ricerca migliore rispetto ad un array(non ordinato), mentre se avessimo un array ordinato avremmo un costo molto più alto per mantenere l'ordine delle variabili(ogni volta che ne inserisci una nuova dovresti riordinarlo tutto con l'heap questo non succede) quindi l'heap si presta bene, in quanto non ha una ricerca "ottima" però nemmeno la peggiore e non si deve subire gli svantaggi di mantenersi ordinato per avere una ricerca efficiente(mantenere ordinato un heap è relativamente semplice, basta una funzione logaritmica(funzione down e up) per gestire gli ingressi e le uscite dei valori con un array ordinato invece devi letteralmente ricorstruire tutto l'array ogni volta che inserisci o elimini un valore)