2012-02-07 3 views
16

In relazione a molte domande e risposte su SO, ho imparato che è meglio fare riferimento a oggetti la cui durata è gestita come residente nella memoria automatica anziché nello stack.Perché i termini "automatico" e "dinamico" sono preferiti rispetto ai termini "stack" e "heap" nella gestione della memoria C++?

Inoltre, gli oggetti allocati dinamicamente non dovrebbero essere indicati come residenti nell'heap, ma nella memoria dinamica.

Capisco che c'è spazio di archiviazione automatico, dinamico e statico, ma non ho mai capito veramente la differenza tra stack automatico e heap dinamico. Perché il primo è preferito?

Non mi sto chiedendo cosa significhi stack/heap o come funzioni la gestione della memoria. Sto chiedendo perché i termini archiviazione automatica/dinamica sono preferiti rispetto ai termini stack/heap.

+0

Prendo il seguente non risponde alla tua domanda? http://stackoverflow.com/questions/408670/stack-static-and-heap-in-c – NPE

+1

@aix no. O almeno non dice che un termine è preferito rispetto all'altro, o la differenza. –

+0

possibile duplicato di [Uso corretto dello stack e dell'heap in C++?] (Http://stackoverflow.com/questions/599308/proper-stack-and-heap-usage-in-c) – NPE

risposta

22

automatico mi dice qualcosa circa la durata di un oggetto: in particolare che essa è tenuta automaticamente al campo di applicazione che racchiude, e verrà distrutto automaticamente quando che esce di ambito.

dinamica mi dice che il ciclo di vita di un oggetto non è controllata automaticamente dal compilatore, ma è sotto il mio controllo diretto.

Stack è un nome sovraccarico per un tipo di contenitore, e per il relativo popolare protocollo puntatore all'istruzione supportato da comuni call e ret istruzioni. Non mi dice nulla sulla durata di un oggetto, se non attraverso un'associazione storica alla vita dell'oggetto in C, a causa delle convenzioni dello stack frame più diffuse. Si noti inoltre che in alcune implementazioni, l'archiviazione locale dei thread è nello stack di una discussione, ma non è limitata all'ambito di una singola funzione.

Heap è di nuovo un nome sovraccarico, che indica un tipo di contenitore ordinato o un sistema di gestione di negozio gratuito. Questo è non è l'unico negozio disponibile su tutti i sistemi e non mi dice nulla di concreto sulla durata di un oggetto assegnato a new.

+0

Buono a sapersi: non tutti i sistemi utilizzano uno "stack" per funzioni non ricorsive. Inoltre: è possibile creare oggetti dinamici nello "stack" (penso che 'boost :: variant does' questo). –

4

I termini di archiviazione automatica/dinamica sono preferibili semplicemente perché questo è ciò che richiede lo standard. Stack/heap sono basati sull'implementazione e possono teoricamente essere implementati in un altro modo.

6

La maggior parte delle implementazioni utilizza una pila per eseguire il backup di oggetti con memorizzazione automatica. Questo non è richiesto dallo standard, ma funziona bene sulla maggior parte delle architetture della CPU in questi giorni.

Le implementazioni utilizzano varie strategie per eseguire il backup di oggetti con durata di archiviazione dinamica. Non sono sicuro che un heap sia il modo migliore per descrivere cosa usano i moderni allocatori di memoria, ma sembra essere il termine "storico" per quello.

Quindi la memorizzazione automatica/dinamica sono termini che gli standard utilizzano per classificare ("astratto") le durate degli oggetti. Questi sono i termini appropriati da utilizzare se si desidera parlare di oggetti come lo standard li descrive.
Stack e heap sono tecniche di implementazione ("concrete") che possono essere utilizzate per eseguirne il backup. L'utilizzo di questi termini è meno corretto, a meno che tu non stia parlando di un'implementazione specifica.

3

L'allocazione stack/heap tecnicamente parlando sono i dettagli dell'implementazione, mentre la memorizzazione automatica/dinamica sono i termini più generali. Lo stesso standard non impone che l'allocatore debba utilizzare uno stack/heap. Quindi automatico/dinamico è il termine più appropriato, anche se personalmente trovo che la distinzione sia un po 'troppo pedante.

1

Pila e heap portare in concetti relativi alla realizzazione in foto, mentre i termini "automatico" e "dinamico" sono più generale

3

I termini "durata statica di stoccaggio", "durata memorizzazione automatica", e "dinamica durata di archiviazione "appaiono nello standard C++.

I termini "stack" e "mucchio" sono usati per riferirsi a funzioni nella libreria standard (stack<>, make_heap(), push_heap(), ecc) che hanno poco a che fare con la durata di archiviazione.

+0

Ci scusiamo per il downvoting della tua risposta precedente, mi sono reso conto che la domanda era ambigua. +1 –