C++, Gratuit Magasin vs Tas
Allocations dynamiques avec new/delete
sont dit de prendre place sur le gratuit magasin,
tandis que malloc/free
opérations d'utiliser le tas.
Je voudrais savoir si il y a une réelle différence dans la pratique.
Faire des compilateurs de faire une distinction entre les deux termes? (Free store et Tas, pas new/malloc
)
Vous devez vous connecter pour publier un commentaire.
Voir http://www.gotw.ca/gotw/009.htm; il est possible de décrire les différences entre le tas et le libre-magasin de loin mieux que je le pouvais:
Gratuit-magasin:
Tas:
Pour le C++, la différence entre la boutique et le tas est devenu purement conceptuel. Comme un pot pour la collecte de bugs, et un pour la collecte des cookies. L'un est marqué d'une manière, l'autre d'une autre. Cette désignation est destinée à conduire à la maison le point que vous ne mélangez JAMAIS des "nouveaux" et "supprimer" avec "malloc", "realloc", ou "libre" (ou à peu des ensembles de niveau d'ailleurs).
Lors d'entrevues, il est bon de dire que le "new et delete utiliser le free store, malloc et free utiliser le tas; new et delete appeler le constructeur et le destructeur, respectivement, cependant malloc et free ne le font pas." Pourtant, vous entendrez souvent que les segments de mémoire sont vraiment dans la même zone, cependant, qui PEUVENT être spécifiques de compilateur, c'est-à-dire, il est possible que les deux peuvent désigner les différents espaces de mémoire piscines (je ne sais pas pourquoi il serait, cependant).
Mike Koval réponse du couvre la théorie assez bien. Dans la pratique, cependant, ils sont presque toujours de la même région de la mémoire -- dans la plupart des cas, si vous creusez dans l'implémentation du compilateur de
new
, vous trouverez des appelsmalloc()
.En d'autres termes: à partir de la machine point de vue, et de tas gratuit store sont la même chose. La distinction qui existe à l'intérieur du compilateur.
Pour rendre les choses encore plus confuses, avant l'avènement de C++, nous avons dit "en tas", pour signifier ce qui est maintenant appelé "free store."
Le terme "tas" peut également se référer à une structure de données, mais dans le contexte du C++ malloc, free, neuf, et les opérations de suppression des termes "en tas" et "free" sont utilisés plus ou moins indifféremment.
Tas et gratuit magasin ne sont pas censés être interopérables.
Au sein des contextes comme dans AVR 8 bits micro-contrôleurs avec c++11 de la Bibliothèque Standard, ils ne peuvent même pas être utilisés dans le même programme. Magasin gratuit et tas de faire leurs allocations dans le même espace mémoire, d'écraser les uns les autres structures de données et les données.
Dans ce contexte, Free store est différent et incompatible avec le Tas parce que le "new/delete free store bibliothèque" est plus simple (et plus rapide) que le "Malloc/free/realloc/calloc tas de bibliothèque" et fournit ainsi l'énorme utilisation de la mémoire des gains pour le C++ embarqué programmeur (dans un contexte où vous avez seulement 512 octets de RAM).
Voir 8 bits c++11/14 de la Bibliothèque Standard à https://github.com/ambroise-leclerc/ETL/tree/master/libstd
Je ne me souviens pas de la norme jamais mentionner le mot tas, sauf dans les descriptions des tas de fonctions comme
push_heap
et coll. Toutes les allocations dynamiques sont effectuées sur le libre-store.Gratuit est un Magasin de piscine de non-alloué de la mémoire de segment donné à un programme qui est utilisé par le programme pour l'allocation dynamique pendant l'exécution du programme.
Chaque programme est fourni avec une piscine de non-alloué la mémoire du tas qu'il peut utiliser lors de l'exécution.
Ce pool de mémoire disponible est appelé free store du programme.
L'allocation d'un magasin libre de la mémoire est sans nom.