web-dev-qa-db-fra.com

C++, Free-Store vs Heap

Les allocations dynamiques avec new/delete ont lieu sur le free-store ,
alors que les opérations malloc/free utilisent le heap .

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? (Free store et Heap, pas new/malloc)

104
Nick Dandoulakis

Voir http://www.gotw.ca/gotw/009.htm ; il peut décrire les différences entre le tas et le free-store bien mieux que moi:

Free-store:

Le magasin gratuit est l'un des deux zones de mémoire dynamiques, allouées/libérées par nouveau/supprimer. La durée de vie d'un objet peut être moins que le temps que le stockage est alloué; c'est-à-dire objets de magasin gratuits peut avoir de la mémoire allouée sans étant immédiatement initialisé, et peut être détruit sans que la mémoire soit immédiatement désalloué. Pendant le période d'allocation du stockage mais en dehors de la vie de l'objet, le le stockage peut être consulté et manipulé à travers un vide * mais aucun du non-statique du proto-objet les membres ou les fonctions des membres peuvent être consultés, ont leurs adresses prises, ou être autrement manipulé.

Tas:

Le tas est l'autre mémoire dynamique zone, alloué/libéré par malloc/free et leurs variantes. Notez que tandis que le nouveau global par défaut et supprimer pourrait être mis en œuvre en termes de malloc et gratuit par un particulier compilateur, le tas n’est pas le même que libérez le magasin et la mémoire allouée dans un zone ne peut pas être désallouée en toute sécurité L'autre. Mémoire allouée à partir du fichier heap peut être utilisé pour des objets de classe tapez par placement-nouvelle construction et destruction explicite. Si utilisé, le notes sur la durée de vie gratuite d'un objet magasin appliquer de la même façon ici.

68
Michael Koval

Pour C++, la différence entre le magasin gratuit et le tas est devenue purement conceptuelle. Comme un pot pour collecter des insectes et un pour collecter des cookies. L'un est étiqueté dans un sens, l'autre dans l'autre. Cette désignation a pour but de faire comprendre que vous ne mélangez JAMAIS "nouveau" et "supprimer" avec "malloc", "realloc" ou "libre" (ou des ensembles de niveaux de bits, d'ailleurs).

Pendant les entretiens, il est bon de dire que "new et delete utilisent les magasins gratuits, malloc et free utilisent le tas; new et delete appellent respectivement le constructeur et le destructeur, bien que malloc et free ne le fassent pas". Pourtant, vous entendrez souvent dire que les segments de mémoire se trouvent vraiment dans le même domaine. Cependant, CAN peut être spécifique au compilateur, c’est-à-dire qu’il est possible que les deux puissent désigner différents espaces mémoire en tant que pools (vous ne savez pas pourquoi, bien que).

51
Kit10

La réponse de Mike Koval couvre assez bien la théorie. Dans la pratique, toutefois, il s’agit presque toujours de la même région de mémoire. Dans la plupart des cas, si vous creusez dans l’implémentation de new du compilateur, vous constaterez qu’elle appelle malloc().

En d'autres termes: du point de vue de la machine, heap et free store 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 voulions dire «tas», ce qu’on entend maintenant par «magasin gratuit».

21
Crashworks

Le tas et le magasin libre ne sont pas censés être interopérables . Dans des contextes restreints comme dans les microcontrôleurs AVR 8 bits avec c ++ 11 Standard Library, ils ne peuvent même pas être utilisés dans le même programme. Free store et heap effectuent leurs allocations dans le même espace mémoire, en se remplaçant les unes les autres, ainsi que les données et les données . ) que la "bibliothèque de tas Malloc/free/realloc/calloc" et offre ainsi au programmeur intégré C++ des gains d’utilisation de mémoire énormes (dans un contexte où vous n’avez que 512 octets de RAM).

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

2

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

2
Jim Lewis

Je ne me souviens pas du standard mentionnant jamais le tas Word, sauf dans les descriptions de fonctions de tas comme Push_heap et autres Toutes les allocations dynamiques sont effectuées sur le free-store.

1
avakar

Free Store est un pool de mémoire de segment non alloué attribué à un programme utilisé par le programme pour une allocation dynamique lors de l'exécution du programme . Chaque programme est doté d'un pool de mémoire de segment non alloué qu'il peut utiliser pendant l'exécution. Ce pool de mémoire disponible est appelé magasin libre du programme . La mémoire de magasin disponible allouée est sans nom. 

0
Sudipto