new/delete
On dit que les allocations dynamiques ont lieu sur le magasin libre ,
tandis que les malloc/free
opé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
)
la source
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 "
new
etdelete
utilisez le magasin gratuit,malloc
etfree
utilisez le tas;new
etdelete
appelez le constructeur et le destructeur, respectivement, cependantmalloc
etfree
ne 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).la source
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 appellemalloc()
.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».
la source
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.
la source
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
la source
Je ne me souviens pas de la norme mentionnant le mot tas, sauf dans les descriptions de fonctions de tas comme
push_heap
et al. Toutes les allocations dynamiques sont effectuées sur la boutique libre.la source
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.
la source