web-dev-qa-db-fra.com

Pourquoi deux concepts différents sont-ils tous deux appelés "tas"?

Pourquoi le tas d'exécution est-il utilisé pour l'allocation dynamique de mémoire dans les langages de style C et la structure de données les deux appelés "le tas"? Y a-t-il une relation?

123
Andrey Fedorov

Donald Knuth dit (L'art de la programmation informatique, troisième édition, vol. 1, p. 435):

Plusieurs auteurs ont commencé vers 1975 à appeler le pool de mémoire disponible un "tas".

Il ne dit pas quels auteurs et ne donne aucune référence à des articles spécifiques, mais il dit que l'utilisation du terme "tas" en relation avec les files d'attente prioritaires est le sens traditionnel du mot.

61
James McNellis

Ils ont le même nom mais ils ne sont pas vraiment similaires (même conceptuellement). Un tas de mémoire est appelé un tas de la même façon que vous appelez un panier à linge un "tas de vêtements". Ce nom est utilisé pour indiquer un endroit un peu en désordre où la mémoire peut être allouée et désallouée à volonté. La structure des données (comme le souligne le lien Wikipedia que vous avez mentionné) est très différente.

49
Andrew Hare

La collision de noms est malheureuse, mais pas si mystérieuse. Heap est un petit mot commun utilisé pour désigner une pile, une collection, un groupe, etc. L'utilisation du mot pour la structure de données précède (j'en suis presque sûr) le nom du pool de Mémoire. En fait, pool aurait été un bien meilleur choix pour ce dernier, à mon avis. Heap connote une structure verticale (comme une pile), qui correspond à la structure de données, mais pas au pool de mémoire. Nous ne pensons pas qu'un tas de pool de mémoire soit hiérarchique, alors que l'idée de base de la structure de données est de garder le plus gros élément au sommet du tas (et des sous-tas).

Heap la structure de données remonte au milieu des années 60; tas le pool de mémoire, au début des années 70. Le terme heap (signifiant pool de mémoire) a été utilisé au moins dès 1971 par Wijngaarden dans les discussions sur ALGOL. 

Peut-être que la première utilisation de heap en tant que structure de données se trouve sept ans plus tôt dans 
Williams, J. W. J. 1964. "Algorithme 232 - Heapsort", Communications of the ACM 7 (6): 347-348.

27
I. J. Kennedy

En fait, lire sur la façon dont la mémoire est allouée (voir Buddy Blocks ) me rappelle un tas dans les structures de données.

6

OMI, ce n’est qu’un hasard/une coïncidence si ces deux choses totalement indépendantes ont le même nom. C'est comme graph et graph .

5
MAK

La structure de données de type tas est utilisée par un algorithme pour trouver une allocation de mémoire disponible. Ce qui suit est extrait de http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .

Lorsque new est invoqué, il commence à rechercher un bloc de mémoire libre qui convient à la taille de votre demande. En supposant qu'un tel bloc de mémoire soit trouvé, il est marqué comme réservé et un pointeur sur cet emplacement est renvoyé. Il existe plusieurs algorithmes pour accomplir cela, car un compromis doit être fait entre le balayage de la mémoire entière pour trouver le plus petit bloc libre supérieur à la taille de votre objet ou le renvoi du premier où la mémoire nécessaire convient. Pour améliorer la rapidité d'obtention d'un bloc de mémoire, les zones de mémoire libres et réservées sont conservées dans une structure de données similaire aux arbres binaires appelés tas. 

4
Peng Zhang

Q. Qu'est-ce qu'un tas? A. Un tas est une collection d'objets placés les uns sur les autres.

Réponse à votre question: Le tas de mémoire et le tas binaire utilisent le même concept, comme vous le savez. Les données sont stockées sous forme de tas dans la mémoire dans le même ordre que celui écrit dans le programme, tandis que le tas binaire est une structure de données qui suit le même concept de stockage de données de manière ordonnée sous la forme de tas (Données au-dessus de l'autre). Faites-moi savoir ce que vous pensez dans la section commentaires.

0
Mayank Tolani

Les termes familiers pile, mémoire et mémoire heap ne sont pas utilisés dans la norme C++. La norme utilise le stockage statique, le stockage de threads, le stockage automatique et le stockage dynamique.

Plus d'informations peuvent être trouvées dans Section Durabilité du stockage de la norme.

Par conséquent, du point de vue du langage et de la bibliothèque standard, il n’ya pas de confusion.

0
R Sahu