Por que o heap de tempo de execução é usado para alocação dinâmica de memória em linguagens no estilo C e a estrutura de dados é chamada de "heap"? Existe alguma relação?
Por que o heap de tempo de execução é usado para alocação dinâmica de memória em linguagens no estilo C e a estrutura de dados é chamada de "heap"? Existe alguma relação?
Respostas:
Donald Knuth diz (The Art of Computer Programming, Terceira Ed., Vol. 1, p. 435):
Vários autores começaram por volta de 1975 a chamar o pool de memória disponível de "pilha".
Ele não diz quais autores e não faz referência a nenhum artigo específico, mas diz que o uso do termo "pilha" em relação às filas prioritárias é o sentido tradicional da palavra.
Eles têm o mesmo nome, mas na verdade não são parecidos (mesmo conceitualmente). Uma pilha de memória é chamada de pilha da mesma maneira que você chamaria um cesto de roupa suja como uma "pilha de roupas". Esse nome é usado para indicar um local um pouco confuso onde a memória pode ser alocada e desalocada à vontade. A estrutura de dados (como o link da Wikipedia que você faz referência) é bem diferente.
A colisão de nomes é lamentável, mas não tão misteriosa. Heap é uma palavra pequena e comum usada para significar uma pilha, coleção, grupo etc. O uso da palavra para a estrutura de dados antecede (tenho certeza) o nome do pool de memória. De fato, a piscina teria sido uma escolha muito melhor para este último, na minha opinião. O heap conota uma estrutura vertical (como uma pilha), que se ajusta à estrutura de dados, mas não ao conjunto de memórias. Não consideramos um heap de pool de memória como hierárquico, enquanto a idéia fundamental por trás da estrutura de dados é manter o maior elemento no topo do heap (e sub-heaps).
Heap a estrutura de dados remonta a meados dos anos 60; monte o conjunto de memórias, no início dos anos 70. O termo heap (que significa pool de memória) foi usado pelo menos desde 1971 por Wijngaarden nas discussões sobre Algol.
Possivelmente, o uso mais antigo de heap como estrutura de dados foi encontrado sete anos antes, em
Williams, JWJ 1964. "Algorithm 232 - Heapsort", Communications of the ACM 7 (6): 347-348
Na verdade, ler sobre a maneira como a memória é alocada (consulte Buddy Blocks ) me lembra um monte de estruturas de dados.
Na IMO, é apenas um acidente / coincidência que essas duas coisas totalmente independentes tenham o mesmo nome. É como gráfico e gráfico .
A estrutura de dados do tipo heap é usada pelo algoritmo de localização da alocação de memória disponível. O seguinte é extraído de http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Quando
new
é chamado, ele começa a procurar um bloco de memória livre que se ajuste ao tamanho da sua solicitação. Supondo que esse bloco de memória seja encontrado, ele é marcado como reservado e um ponteiro para esse local é retornado. Existem vários algoritmos para fazer isso, porque é necessário fazer um compromisso entre a varredura de toda a memória para encontrar o menor bloco livre maior que o tamanho do seu objeto ou retornar o primeiro onde a memória necessária se encaixa. Para melhorar a velocidade de obtenção de um bloco de memória, as áreas livres e reservadas da memória são mantidas em uma estrutura de dados semelhante às árvores binárias chamadas heap.
Os termos coloquiais empilham memória e heap memory não são usados no padrão C ++. O padrão usa armazenamento estático, armazenamento de threads, armazenamento automático e armazenamento dinâmico.
Mais informações podem ser encontradas na seção Duração do armazenamento do padrão.
Portanto, do ponto de vista da linguagem e da biblioteca padrão, não há confusão.
P. o que é uma pilha? R. Um heap é uma coleção de objetos colocados um em cima do outro.
Resposta à sua pergunta: O heap de memória e o binário usam o mesmo conceito que você conhece. Os dados são armazenados na forma de um heap na memória na mesma ordem em que foram gravados no programa, enquanto o heap binário é uma estrutura de dados que segue o mesmo conceito de armazenamento de dados de maneira ordenada na forma de heap (Data on top do outro). Deixe-me saber o que você pensa na seção de comentários.
Talvez o primeiro heap de memória implementado tenha sido gerenciado por uma estrutura de heap?