103 votes

Quelle est la différence entre VirtualAlloc et HeapAlloc?

Il existe de nombreuses méthodes pour allouer de la mémoire dans l'environnement Windows, telles que VirtualAlloc / HeapAlloc / malloc / new.

Ainsi, quelle est la différence entre eux?

102voto

Doug Points 4923

Chaque API est pour des utilisations différentes. Chacun exige également que vous utilisez le bon de libération/libération de la fonction lorsque vous avez terminé avec la mémoire.

VirtualAlloc

Un faible niveau, de l'API Windows qui fournit beaucoup d'options, mais il est surtout utile pour les personnes relativement à des situations spécifiques. Ne peut allouer de la mémoire (edit: pas moins de 4 ko) de plus gros morceaux. Il y a des situations où vous en avez besoin, mais vous savez quand vous êtes dans une de ces situations. Un des plus commune est que si vous avez à partager de la mémoire directement avec un autre processus. Ne l'utilisez pas à des fins générales de l'allocation de mémoire. Utiliser VirtualFree désallouer.

HeapAlloc

Alloue quelle que soit la taille de la mémoire que vous demandez, pas de gros morceaux de VirtualAlloc. HeapAlloc sait quand il a besoin d' VirtualAlloc et le fait automatiquement pour vous. Comme malloc, mais est uniquement pour Windows, et fournit un couple de plus d'options. Adapté pour la répartition générale des morceaux de mémoire. Certaines Api Windows peut exiger que vous utiliser pour allouer de la mémoire que vous passer, ou de l'utilisation de son compagnon HeapFree pour libérer de la mémoire qu'ils retournent à vous.

malloc

Le C moyen d'allouer de la mémoire. Préférez si vous écrivez en C plutôt qu'en C++, et vous voulez que votre code de travail sur, par exemple, des ordinateurs Unix trop, ou une personne en particulier dit que vous avez besoin de l'utiliser. Ne pas procéder à l'initialisation de la mémoire. Adapté pour la répartition générale des morceaux de mémoire, comme HeapAlloc. Une API simple. Utiliser free désallouer. Visual C++' malloc des appels HeapAlloc.

nouveau

Le C++ moyen d'allouer de la mémoire. Préférez si vous écrivez en C++. Il met un objet ou des objets dans la mémoire allouée, trop. Utiliser delete désallouer. Visual studio new des appels HeapAlloc, et puis peut-être initialise les objets, selon comment vous l'appelez.

Il ya aussi un couple de d'autres fonctions semblables, comme SysAllocString que vous avez peut-être dit que vous avez à utiliser dans des circonstances particulières.

31voto

RandomNickName42 Points 3994

VirtualAlloc est une institution spécialisée dans l'allocation de l'OS de la VM système. L'Allocation doit être faite sur une granularité d'allocation qui est dépendante de l'architecture. Il est l'un des la plupart des formes de base de l'allocation de mémoire. VM allocations peuvent prendre plusieurs formes, la mémoire n'est pas nessisarially dédié ou physiquement sauvegardés dans la mémoire RAM (mais il peut l'être). Il est généralement un but spécial type d'allocation, soit de varier les grands, qui doit être partagée, doit être aligné sur un particulier de la valeur (des raisons de performances), ou si l'appelant n'a pas besoin d'utiliser la totalité de cette mémoire à la fois... etc...

HeapAlloc est essentiellement ce que malloc et nouvelle à la fois, éventuellement appel. Il est conçu pour être très rapide et utilisables dans de nombreux types différents de scenerio est d'un usage général, de l'allocation. C'est le "Tas" dans un cadre classique sence. Tas sont effectivement de installation par un VirtualAlloc, qui est ce qui est utilisé pour d'abord l'espace de réserve de l'OS, après cela, l'espace est initialisé, ce qui est quand divers tableaux, listes et autres structures de données sont configurés pour maintenir et contrôler le fonctionnement de la pile. Certains de qui est dans la forme de dimensionnement dynamique (croissance et de la réduction), de l'adaptation à particulier usages (allocations de fréquentes d'une certaine taille), etc..

nouveau et le malloc sont un peu le même, la fonction malloc est essentiellement exacte de l'appel en HeapAlloc( tas-id-par défaut ); nouvelle cependant, pouvez configurer l'objet pour C++. C++ magasin vtable sur le tas pour chaque appelant. Ces vtable sont redirige pour l'exécution et font partie de ce qui donne du C++ c'est oo charicteristics comme inheratence, de surcharge de fonctions, etc...

D'autres méthodes de répartition; _alloca() et _malloca sont pile, FileMappings sont vraiment VirtualAlloc avais avec perticualr de bits indicateurs de qui les désigne FICHIER.

La plupart du temps, vous devez allouer de la mémoire dans une manière qui est compatible avec l'utilisation de la mémoire ;). nouveau en C++, la fonction malloc en C, VirtualAlloc pour massif ou de l'IPC cas.

*** Note, grande allocation de mémoire par HeapAlloc sont effectivement expédiées à d'Virtuel Alloc après une certaine taille (quelques centaines de k ou 16 MO ou quelque chose que j'oublie, mais assez gros :)

*** EDIT Je brefly fait remarquer à propos de la CIB et VirtualAlloc, il y a aussi quelque chose de très agréable sur un liés VirtualAlloc dont aucun répondeur est à cette question ont discuté.

VirtualAlloc Ex est ce que l'un processus peut utiliser pour allouer de la mémoire dans les différents espace d'adressage du processus. Plus généralement, utilisés en combinaison pour obtenir de l'exécution à distance dans le cadre d'un autre processus via CreateRemoteThread (similaires à CreateThread, le fil est tout simplement courir dans l'autre processus).

5voto

VirtualAlloc ===> sbrk () sous UNIX HeapAlloc ====> malloc () sous UNIX

3voto

No hay Problema Points 442

Je vais faire très simple pour vous:

VirtualAlloc => Alloue directement dans la mémoire virtuelle, vous réserve de s'engager dans des blocs. C'est idéal pour les grandes affectations, par exemple, de grands tableaux.

HeapAlloc / new => alloue de la mémoire sur le tas par défaut (ou de tout autre segment de mémoire que vous pouvez créer). Il alloue par objet et est idéal pour les petits objets. Le segment par défaut est sérialisable, il a donc la garantie du fil de répartition (ce qui peut causer quelques problèmes sur la haute performance des scénarios et c'est pourquoi vous pouvez créer votre propre tas).

malloc => utilise le runtime C tas, semblable à HeapAlloc mais il est commun pour la compatibilité des scénarios.

En un mot, le tas est juste un morceau de la mémoire virtuelle qui est régi par un gestionnaire de tas (plutôt que brut de la mémoire virtuelle)

le dernier modèle sur le monde de la mémoire est fichiers mappés en mémoire, ce scénario est idéal pour grande partie de données (comme les gros fichiers). Ce est utilisé en interne lorsque vous ouvrez un fichier EXE (il ne charge pas le fichier EXE dans le mémoire, crée un fichier mappé en mémoire).

Espérons que cette aide

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