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)

Nick Dandoulakis
la source

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.

Michael Koval
la source
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).

Kit10
la source
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».

Crashworks
la source
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.

Jim Lewis
la source
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

Ambroise Leclerc
la source
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.

Avakar
la source
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.

Sudipto
la source