C ++, magasin gratuit ou tas


124

new/deleteOn dit que les allocations dynamiques ont lieu sur le magasin libre ,
tandis que les malloc/freeopérations utilisent le tas .

J'aimerais savoir s'il y a une différence réelle, dans la pratique.
Les compilateurs font-ils une distinction entre les deux termes? ( Magasin gratuit et tas , pas new/malloc)

Réponses:


76

Voir http://www.gotw.ca/gotw/009.htm ; il peut décrire les différences entre le tas et le magasin gratuit bien mieux que je ne pourrais:

Magasin gratuit:

La mémoire libre est l'une des deux zones de mémoire dynamique, allouée / libérée par new / delete. La durée de vie de l'objet peut être inférieure à la durée d'allocation du stockage; c'est-à-dire que les objets de stockage libres peuvent avoir de la mémoire allouée sans être immédiatement initialisés, et peuvent être détruits sans que la mémoire ne soit immédiatement désallouée. Pendant la période où le stockage est alloué mais en dehors de la durée de vie de l'objet, le stockage peut être accédé et manipulé par un vide * mais aucun des membres non statiques ou des fonctions membres du proto-objet ne peut être accédé, avoir leurs adresses prises ou être autrement manipulé .

Tas:

Le tas est l'autre zone de mémoire dynamique, allouée / libérée par malloc / free et leurs variantes. Notez que bien que le new et delete global par défaut puissent être implémentés en termes de malloc et free par un compilateur particulier, le tas n'est pas le même que le stockage libre et la mémoire allouée dans une zone ne peut pas être libérée en toute sécurité dans l'autre. La mémoire allouée à partir du tas peut être utilisée pour des objets de type classe par nouvelle construction de placement et destruction explicite. Si tel est le cas, les remarques sur la durée de vie des objets du magasin gratuit s'appliquent de la même manière ici.


23
Je ne suis pas d'accord. Le mot "tas" dans le contexte de l'allocation dynamique n'est utilisé ni par le standard C ++ ni par C99 (je n'ai pas C89 auquel se réfère C ++, n'hésitez pas à me corriger s'il utilise le mot). Je n'ai pas pu trouver la date de publication du GotW en question, mais comme il parle du projet, il est évidemment pré-standard.
avakar

2
C'est toute la question de la terminologie, à mon humble avis. Dites, monsieur. Stroustrup ne distingue pas «tas» et «magasin libre»: stroustrup.com/Programming/17_free_store.ppt , slide 12. «Heap» était utilisé comme synonyme de mémoire dynamique il y a bien longtemps avant C ++, depuis l'époque de Lisp (1960) qui utilisait structure de données de tas pour l'allocation de mémoire.
Alexey Voytenko

Je considère généralement le tas (via maloc / free) comme une sorte de fournisseur de matières premières. Vous demandez un morceau de mémoire, vous l'obtenez sans fioritures. Vous devez construire vous-même toutes les structures. Le magasin gratuit (nouveau / supprimer) ressemble plus à un fournisseur de «produits finis». Vous demandez un objet et on lui alloue de l'espace, ainsi que l'objet qu'il a construit et préparé pour votre utilisation. Quand il est terminé, il est bien nettoyé.
Anshuman Kumar

67

Pour C ++, la différence entre le magasin gratuit et le tas est devenue purement conceptuelle. Comme un pot pour collecter des bugs et un pour collecter des cookies. L'un est étiqueté d'une manière, l'autre d'une autre. Cette désignation est destinée à vous faire comprendre que vous ne mélangez JAMAIS " new" et " delete" avec " malloc", " realloc" ou " free" (ou des ensembles de niveaux de bits d'ailleurs).

Au cours des entretiens, il est bon de dire que " newet deleteutilisez le magasin gratuit, mallocet freeutilisez le tas; newet deleteappelez le constructeur et le destructeur, respectivement, cependant mallocet freene le font pas." Pourtant, vous entendrez souvent que les segments de mémoire sont vraiment dans la même zone - cependant, que PEUT être spécifique au compilateur, c'est-à-dire qu'il est possible que les deux puissent désigner différents espaces de mémoire comme pools (je ne sais pas pourquoi, bien que).


28

La réponse de Mike Koval couvre assez bien la théorie. Dans la pratique, cependant, ils sont presque toujours la même région de mémoire - dans la plupart des cas, si vous creusez dans l'implémentation du compilateur de new, vous trouverez qu'elle appelle malloc().

En d'autres termes: du point de vue de la machine, le tas et le stockage gratuit sont la même chose. La distinction existe à l'intérieur du compilateur.

Pour rendre les choses encore plus confuses, avant l'avènement du C ++, nous disions «tas» pour signifier ce que l'on appelle maintenant «magasin gratuit».


5

Le terme «tas» peut également faire référence à une structure de données particulière, mais dans le contexte des opérations C ++ malloc, free, new et delete les termes «tas» et «free store» sont utilisés de manière plus ou moins interchangeable.


3

Heap et free-store ne sont pas censés être interopérables. Dans les contextes contraints comme dans les micro-contrôleurs AVR 8 bits avec la bibliothèque standard c ++ 11, ils ne peuvent même pas être utilisés dans le même programme. Le stockage libre et le tas effectuent leurs allocations dans le même espace mémoire, en écrasant les structures et les données. Dans ce contexte, Free store est différent et incompatible avec Heap car la "new / delete free store library" est plus simple (et plus rapide) que la "bibliothèque de tas Malloc / free / realloc / calloc" et fournit ainsi d'énormes gains d'utilisation de la mémoire au Programmeur embarqué C ++ (dans un contexte où vous ne disposez que de 512 octets de RAM).

Voir la bibliothèque standard 8 bits c ++ 11/14 à https://github.com/ambroise-leclerc/ETL/tree/master/libstd


2

Je ne me souviens pas de la norme mentionnant le mot tas, sauf dans les descriptions de fonctions de tas comme push_heapet al. Toutes les allocations dynamiques sont effectuées sur la boutique libre.


1

Free Store est un pool de mémoire de tas non allouée donnée à un programme qui est utilisé par le programme pour l'allocation dynamique pendant l'exécution du programme. Chaque programme est fourni avec un pool de mémoire de tas non allouée qu'il peut utiliser pendant l'exécution. Ce pool de mémoire disponible est appelé stockage libre du programme. La mémoire de stockage libre allouée est sans nom.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.