Comparaison des méthodes d’allocation de mémoire
Voici une brève comparaison des différentes méthodes d’allocation de mémoire :
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- nouveau
- VirtualAlloc
Bien que les fonctions GlobalAlloc, LocalAlloc et HeapAlloc allouent finalement de la mémoire à partir du même tas, chacune fournit un ensemble légèrement différent de fonctionnalités. Par exemple, HeapAlloc peut être invité à déclencher une exception si la mémoire n’a pas pu être allouée, une fonctionnalité non disponible avec LocalAlloc. LocalAlloc prend en charge l’allocation de handles qui permettent à la mémoire sous-jacente d’être déplacée par une réallocation sans modifier la valeur du handle, une fonctionnalité non disponible avec HeapAlloc.
À compter de Windows 32 bits, GlobalAlloc et LocalAlloc sont implémentés en tant que fonctions wrapper qui appellent HeapAlloc à l’aide d’un handle vers le tas par défaut du processus. Par conséquent, GlobalAlloc et LocalAlloc ont une surcharge supérieure à HeapAlloc.
Étant donné que les différents allocateurs de tas fournissent des fonctionnalités distinctes en utilisant différents mécanismes, vous devez libérer de la mémoire avec la fonction appropriée. Par exemple, la mémoire allouée avec HeapAlloc doit être libérée avec HeapFree et non LocalFree ou GlobalFree. La mémoire allouée avec GlobalAlloc ou LocalAlloc doit être interrogée, validée et libérée avec la fonction globale ou locale correspondante.
La fonction VirtualAlloc vous permet de spécifier des options supplémentaires pour l’allocation de mémoire. Toutefois, ses allocations utilisent une granularité de page, de sorte que l’utilisation de VirtualAlloc peut entraîner une utilisation plus élevée de la mémoire.
La fonction malloc présente l’inconvénient d’être dépendante de l’exécution. Le nouvel opérateur présente l’inconvénient d’être dépendant du compilateur et du langage.
La fonction CoTaskMemAlloc présente l’avantage de bien fonctionner en C, C++ ou Visual Basic. Il s’agit également du seul moyen de partager de la mémoire dans une application COM, car MIDL utilise CoTaskMemAlloc et CoTaskMemFree pour marshaler la mémoire.
Exemples
Rubriques connexes