malloc() vs HeapAlloc()
Quelle est la différence entre la fonction malloc() et HeapAlloc()? Autant je comprends malloc alloue de la mémoire dans le tas, tout comme HeapAlloc, droit?
Quelle est donc la différence?
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous avez raison, ils ont tous les deux allouer de la mémoire à partir d'un segment de mémoire. Mais il y a des différences:
malloc()
est portable, partie de la norme.HeapAlloc()
n'est pas portable, c'est une fonction API Windows.C'est tout à fait possible que, sous Windows,
malloc
serait mis en œuvre sur le dessus deHeapAlloc
. Je m'attends à cemalloc
être plus rapide queHeapAlloc
.HeapAlloc
a plus de souplesse quemalloc
. En particulier, il permet de spécifier les tas que vous souhaitez allouer à partir. Cette approvisionne pour plusieurs tas par processus.Pour presque tout le codage des scénarios, vous utilisez
malloc
plutôt queHeapAlloc
. Même si, depuis que vous avez attaché votre question C++, je voudrais que vous soyez à l'aide denew
!malloc
être plus rapide queHeapAlloc
si elle est mise en œuvre sur le dessus deHeapAlloc
?malloc
peut mettre en œuvre d'autres sous-modèles d'allocation.malloc
n'a pas besoin de faire suballocations (depuis Win2000 SP4); le système d'exploitation fourni Faible Fragment de Tas (LFH) peut maintenant faire des petites allocations efficacement aussi bien.fopen
.fopen
n'est rien de plus qu'une plate-forme indépendante-isation d'un appel. c'est une conséquence directe de l'envelopper. Mais malloc peut être comme David le dit. Jetez un oeil àdlmalloc
mise en œuvre; le but est de réduire le nombre d'appels àsrbk
autant que possible, à l'aide personnalisé de la corbeille de l'emballage, des piscines jusqu'à 256 ko et a ordonné les listes libres. De ce que je comprends, microsoft cherche à donner à toutes ces fonctionnalités directement dansHeapAlloc
, éliminant tout besoin d'un habilemalloc
. À partir de repères personnels, Win8 régime est maintenant très rapideEn fait, la fonction malloc() (et d'autres C runtime tas de fonctions) sont de module de charge, ce qui signifie que si vous appelez la fonction malloc() dans le code d'un module (c'est à dire une DLL), alors vous devriez appeler free() dans le code d'un même module ou vous pourriez souffrir d'un assez mauvais corruption de segment de mémoire (et cela a été bien documenté). À l'aide de HeapAlloc() avec GetProcessHeap() à la place de malloc(), y compris la surcharge nouveau et supprimer des opérateurs à faire usage de ces, vous permettent de passer les objets alloués dynamiquement entre les modules et ne pas avoir à vous soucier de corruption de la mémoire si la mémoire est allouée dans le code d'un module et libéré dans le code d'un autre module une fois que le pointeur vers un bloc de mémoire a été transmis à travers un module externe.
malloc()
est portable, mais lorsque vous avez besoin de déplacer des objets et des Dll participer, vous devez le Tas. Pour les développeurs Windows, je vous conseille d'utiliser le Segment de mémoire et d'écriture personnalisé STL allocateur de le Tas trop.Avec Visual C++, la fonction
malloc()
ou l'opérateurnew
appelle éventuellementHeapAlloc()
. Si vous déboguer le code, vous trouverez la fonction_heap_alloc_base()
(dans le fichiermalloc.c
) appellereturn HeapAlloc(_crtheap, 0, size)
où_crtheap
est un tas global créé avecHeapCreate()
.La fonction
HeapAlloc()
fait un bon travail pour réduire la surcharge de la mémoire, avec un minimum de 8 octets par répartition. Le plus grand que j'ai vu est de 15 octets par répartition, pour les allocations allant de 1 octet à 100 000 octets. Gros blocs ont de plus grands frais généraux, cependant, comme un pour cent du total alloué, il reste moins de 2,5% de la charge utile.Je ne peux pas commenter sur les performances, car je n'ai pas comparé les
HeapAlloc()
avec une coutume fait régulier, mais aussi loin que la surcharge de la mémoire de l'aideHeapAlloc()
, la surcharge est étonnamment faible.HeapAlloc
, confirmez-vous ?malloc
est une fonction de la bibliothèque C standard (et aussi dans le C++ standard library).HeapAlloc
est une fonction Windows API.Ce dernier vous permet de spécifier le segment de mémoire à allouer à partir, qui, j'imagine, peut être utile pour éviter la sérialisation des demandes d'allocation dans différents threads (note de l'
HEAP_NO_SERIALIZE
drapeau).Cheers & hth.,
En outre, vous pouvez vous référer à:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs. 85).aspx
Qui signifie que vous pouvez activer certaines fonctionnalités du SEGMENT de mémoire gérés par WinApi allocateur de mémoire, par exemple, "HeapEnableTerminationOnCorruption".
Que je comprends, cela permet à certains de base à un débordement de tas de protections qui peuvent être considérés comme une valeur ajoutée à votre demande en termes de sécurité.
(par exemple, je préfère le plantage de mon application (comme une application propriétaire) plutôt que d'exécuter du code arbitraire)
Autre chose, c'est qu'il pourrait être utile en phase précoce de développement, de sorte que vous pourriez attraper des problèmes de mémoire avant de passer à la production.
Dans les systèmes où plusieurs Dll peuvent aller et venir (via la fonction LoadLibrary/Freelibrary), et lorsque la mémoire est peut-être allouées dans une DLL, mais il est libéré dans l'autre (voir réponse précédente), HeapAlloc et d'autres fonctions semblent être les moins-petit dénominateur commun pour la réussite de la mémoire de partage.
Thread-safe, sans doute hautement optimisé par des Docteurs à gogo, HeapAlloc s'affiche à travailler dans toutes sortes de situations où nos pas-si-code partageable à l'aide de malloc/free serait un échec.
Nous sommes une C++ embarqué boutique, nous avons donc surchargé l'opérateur new/delete à l'échelle de notre système à l'utilisation de la HeapAlloc( GetProcessHeap( ) ) qui peut écrasa (sur la cible) ou maternelle (pour windows) pour la portabilité du code.
Jusqu'à présent pas de problèmes maintenant que nous avons contourné malloc/free qui semblent indiscutablement DLL spécifiquement, un nouveau "en tas", pour chaque chargement des DLL.
C'est ce que MS a à dire à ce sujet: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs. 85).aspx
Une chose, celui qui est mentionné à ce jour est: "La fonction de malloc a le désavantage d'être exécuté à temps dépendant. Le nouvel opérateur a le désavantage d'être dépendant du compilateur et dépendant d'une langue."
Aussi, "HeapAlloc peut être demandé de lever une exception si la mémoire ne peut pas être attribué"
Donc, si vous voulez que votre programme à exécuter avec toute la CRT, ou peut-être pas de CRT à tous, vous l'auriez HeapAlloc. Peut-être que les gens qui le ferait une telle chose serait d'être les auteurs de logiciels malveillants. Une autre utilisation peut être si vous êtes à la rédaction d'un mémoire intensive des applications spécifiques à l'allocation de la mémoire/l'utilisation de modèles que vous préférez écrire votre propre tas allocateur au lieu d'utiliser un tube CATHODIQUE d'un.
malloc est fonction exportée par la bibliothèque runtime C(CRT), qui est le compilateur spécifique.
C run-time library dll changements de nom à partir des versions de visual studio versions.
HeapAlloc fonction est exportée par kernel32.dll présent dans le dossier windows.