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, LocalAllocet HeapAlloc allouent finalement de la mémoire à partir du même tas, chacune d’elles fournit un ensemble de fonctionnalités légèrement différent. Par exemple, HeapAlloc peut être invité à lever une exception si la mémoire n’a pas pu être allouée, fonctionnalité non disponible avec LocalAlloc. LocalAlloc prend en charge l’allocation de handles qui permettent de déplacer la mémoire sous-jacente par une réallocation sans modifier la valeur de handle, fonctionnalité non disponible avec HeapAlloc.
à partir de 32 bits Windows, 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 distinctives à l’aide de différents mécanismes, vous devez libérer de la mémoire avec la fonction correcte. 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. par conséquent, l’utilisation de VirtualAlloc peut entraîner une augmentation de l’utilisation 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 de dépendre du compilateur et de la langue.
La fonction CoTaskMemAlloc présente l’avantage de fonctionner correctement en C, C++ ou Visual Basic. C’est également la seule façon de partager la mémoire dans une application COM, car MIDL utilise CoTaskMemAlloc et CoTaskMemFree pour marshaler la mémoire.