63 votes

malloc () contre heapalloc ()

Quelle est la différence entre malloc () et HeapAlloc ()? Autant que je sache, malloc alloue de la mémoire à partir du tas, tout comme HeapAlloc, non?

Alors, quelle est la difference?

Merci!

88voto

En 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.

55voto

David Heffernan Points 292687

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 seraient mises en œuvre sur le dessus de l' HeapAlloc. Je m'attends malloc pour être plus rapide que l' HeapAlloc.

HeapAlloc a plus de souplesse que malloc. 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 que vous utiliseriez malloc plutôt que d' HeapAlloc. Même si, depuis que vous avez attaché votre question C++, je vous attends à l'aide d' new!

25voto

Daniel Morin Points 141

Avec Visual C++, la fonction malloc() ou l'opérateur new finalement appels HeapAlloc(). Si vous déboguer le code, vous trouverez la fonction _heap_alloc_base() (dans le fichier malloc.c) de l'appelant return HeapAlloc(_crtheap, 0, size)_crtheap est un tas global créé avec HeapCreate().

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'utilisation de HeapAlloc(), la charge est étonnamment faible.

6voto

malloc est une fonction de la bibliothèque standard C (et également de la bibliothèque standard C ++).

HeapAlloc est une fonction API Windows.

Ce dernier vous permet de spécifier le tas à allouer, ce qui, j’imagine, peut être utile pour éviter la sérialisation des demandes d’allocation dans différents threads (notez le drapeau HEAP_NO_SERIALIZE ).

Vive & hth.,

0voto

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X