2011-08-19 19 views
11

Perché i linguaggi di assemblaggio utilizzano sia uno stack sia un heap? Sembrano ridondanti.Perché c'è uno stack e un heap?

+6

mentre è una buona domanda, ha già risposto [qui] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars

+0

... e un una domanda simile, incentrata su Windows, è stata risposta [qui] (http://stackoverflow.com/questions/2422252/windows-assembly-heap-and-stack) (poiché l'altro è specifico per il sistema operativo, non sto votando per chiudere , ma è una chiamata vicina). – eran

risposta

12

Non sono ridondanti. Ognuno di loro ha punti di forza e punti deboli: uno stack è più veloce se usato correttamente, perché l'allocazione della memoria è banale (push/pop). Lo svantaggio è che puoi solo aggiungere e rimuovere elementi in alto (da qui il nome, stack). Inoltre, lo spazio totale dello stack è limitato e quando si esaurisce, si ottiene ... beh, stack overflow. L'heap, al contrario, consente allocazioni e deallocazioni casuali, e lì è possibile memorizzare grandi quantità di dati, ma lo svantaggio è che l'allocazione comporta un sovraccarico maggiore: per ogni blocco di memoria allocato, è necessario trovare una porzione libera adatta e nel Nel lungo periodo, la frammentazione dello spazio libero deve essere evitata e il sistema deve tracciare dove sono i blocchi liberi.

Si utilizza la pila per trasmettere piccoli valori di breve durata, ad es. variabili del contatore locale, argomenti della funzione, valori di ritorno, ecc .; questi si prestano allo stile di allocazione push/pop. Per strutture di dati più grandi o di lunga durata, si utilizza l'heap.

2

Riguarda la gestione e la gestione della memoria. Esistono diversi tipi di registri di architetture x86. Ci sono possibilità di gestione della memoria hardware supportata su architettura x86 e così via.

Lo stack viene utilizzato dal puntatore di istruzioni, Heap è per il segmento di dati in alcune applicazioni.

Per saperne di più vi consiglio di leggere i seguenti link:

"Un modello di memoria consente un compilatore di eseguire molti importanti ottimizzazioni" - Wikipedia

3

Si potrebbe certamente costruire un sistema informatico che utilizzava uno di essi come unico modello di memoria. Tuttavia, entrambi hanno proprietà piuttosto diverse, ciascuna con i suoi punti positivi e negativi. La maggior parte dei sistemi utilizza entrambi in modo da ottenere i benefici da ciascuno di essi.

Pile

Una pila può essere pensato come una pila di piastre, si scrive un valore in un piatto e metterlo in cima alla pila questo è chiamato un'operazione push e memorizza un valore lo stack. Ovviamente puoi anche rimuovere la piastra superiore dalla pila, questa operazione si chiama pop. Ma le nuove allocazioni devono sempre essere in cima alla pila.

La pila tende ad essere utilizzata per variabili locali e valori di passaggio tra le funzioni. Generalmente le pile hanno le seguenti proprietà impressionanti:

  • richiede solo una manciata di puntatori per gestire
  • molto facile da implementare in hardware, maggior parte dei processori hanno costruito in supporto hardware per una pila che lo rende ancora più veloce.
  • Molto pratica ai allocare memoria

Il problema con la pila viene dagli elementi fatto può essere aggiunto solo/rimossi dalla parte superiore della pila. Ora questo ha molto senso quando si attraversano su e giù per le chiamate di funzione: le funzioni pop immettono dallo stack, allocano lo spazio per le variabili locali nello stack, eseguono la funzione, cancellano le variabili locali dalla cima dello stack e spingono il valore di ritorno sullo stack . Se invece voglio allocare un po 'di memoria e dirlo passarlo ad un altro thread o in generale liberarlo lontano da dove è stato assegnato tutto ad un tratto ho un problema, lo stack non è nella posizione corretta quando voglio per liberare la memoria.

Si potrebbe dire che lo stack facilita l'allocazione rapida della memoria sequenziale.

mucchio

Ora il cumulo è diverso ciascuna assegnazione è generalmente monitorato separatamente. Ciò causa un sacco di spese generali per allocazioni e deallocations, ma ognuna può essere gestita indipendentemente dalle altre allocazioni di memoria, fino a esaurimento della memoria.

Ci sono numerosi algoritmi per realizzare questo ed è probabilmente un po 'imprudente Twitter su di loro qui, ma qui è un link che parla di un buon paio di semplici algoritmi di allocazione heap: Alternatives to malloc and new

Così il mucchio facilita casuale l'allocazione di memoria, ma questa viene fornita con una penalità di runtime, tuttavia quella penalità è spesso piccola rispetto a ciò che si sarebbe incorsa se si dovesse gestire la situazione usando solo lo stack.

Problemi correlati