Perché l'heap di runtime viene utilizzato per l'allocazione dinamica della memoria in linguaggi di tipo C e la struttura dei dati entrambi chiamati "heap"? C'è qualche relazione?
Perché l'heap di runtime viene utilizzato per l'allocazione dinamica della memoria in linguaggi di tipo C e la struttura dei dati entrambi chiamati "heap"? C'è qualche relazione?
Risposte:
Donald Knuth afferma (The Art of Computer Programming, Third Ed., Vol. 1, p. 435):
Numerosi autori iniziarono verso il 1975 a definire un "mucchio" di memoria disponibile.
Non dice quali autori e non fornisce riferimenti a nessun documento specifico, ma afferma che l'uso del termine "heap" in relazione alle code prioritarie è il senso tradizionale della parola.
Hanno lo stesso nome ma in realtà non sono simili (anche concettualmente). Un heap di memoria è chiamato heap nello stesso modo in cui si farebbe riferimento a un cesto della biancheria come un "mucchio di vestiti". Questo nome viene utilizzato per indicare un luogo un po 'disordinato in cui la memoria può essere allocata e deallocata a piacimento. La struttura dei dati (come sottolinea il link di Wikipedia che fai riferimento) è piuttosto diversa.
La collisione del nome è sfortunata, ma non così misteriosa. Heap è una piccola parola comune usata per indicare un mucchio, una raccolta, un gruppo, ecc. L'uso della parola per la struttura dei dati precede (ne sono abbastanza sicuro) il nome del pool di memoria. In effetti, piscina sarebbe stata una scelta molto migliore per quest'ultima, secondo me. Heap connota una struttura verticale (come una pila), che si adatta alla struttura dei dati, ma non al pool di memoria. Non pensiamo a un heap del pool di memoria come gerarchico, mentre l'idea fondamentale dietro la struttura dei dati è mantenere l'elemento più grande in cima all'heap (e sotto-heap).
Ammucchiare la struttura dei dati risale alla metà degli anni '60; ammucchiare il pool di memoria, all'inizio degli anni '70. Il termine heap (che significa pool di memoria) fu usato almeno nel 1971 da Wijngaarden nelle discussioni su Algol.
Probabilmente il primo utilizzo dell'heap come struttura di dati si trova sette anni prima in
Williams, JWJ 1964. "Algorithm 232 - Heapsort", Communications of the ACM 7 (6): 347-348
In realtà, leggere il modo in cui viene allocata la memoria (vedi Buddy Blocks ) mi ricorda un mucchio di strutture di dati.
IMO è semplicemente un incidente / coincidenza che queste due cose completamente indipendenti abbiano lo stesso nome. E 'come grafico e grafico .
La struttura dei dati simile a un heap viene utilizzata dall'algoritmo per trovare l'allocazione di memoria disponibile. Quanto segue è tratto da http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Quando
new
viene invocato, inizia a cercare un blocco di memoria libero che si adatti alle dimensioni della richiesta. Supponendo che un tale blocco di memoria venga trovato, viene contrassegnato come riservato e viene restituito un puntatore a tale posizione. Esistono diversi algoritmi per raggiungere questo obiettivo, poiché è necessario scendere a compromessi tra la scansione dell'intera memoria per trovare il blocco libero più piccolo più grande della dimensione dell'oggetto o restituire il primo in cui si adatta la memoria necessaria. Al fine di migliorare la velocità di ottenimento di un blocco di memoria, le aree di memoria libere e riservate vengono mantenute in una struttura di dati simile agli alberi binari chiamata heap.
I termini colloquiali stack memory e heap memory non sono utilizzati nello standard C ++. Lo standard utilizza l'archiviazione statica, l'archiviazione thread, l'archiviazione automatica e l'archiviazione dinamica.
Maggiori informazioni sono disponibili nella sezione Durazione di stoccaggio dello standard.
Quindi, dal punto di vista della lingua e della libreria standard, non c'è confusione.
D. Che cos'è un heap? A. Un heap è una raccolta di oggetti posizionati uno sopra l'altro.
Risposta alla tua domanda: sia l'heap di memoria che l'heap binario usano lo stesso concetto che conosci. I dati vengono archiviati sotto forma di heap nella memoria nello stesso ordine in cui sono scritti nel programma, mentre l'heap binario è una struttura di dati che segue lo stesso concetto di archiviazione dei dati in modo ordinato sotto forma di heap (Dati in alto dell'altro). Fammi sapere cosa ne pensi nella sezione commenti.
Forse il primo heap di memoria implementato è stato gestito da una struttura heap?