Question

Je voudrais savoir quelle méthode est recommandée avec Windows C: utiliser malloc ou la fonction Win32 HeapAlloc (peut-être VirtualAlloc?).

J'ai lu le Fonctions de gestion de la mémoire MSDN article et les articles MSDN concernant malloc et HeapAlloc, mais ils ne précisent pas lequel doit être utilisé et dans quelles situations.

Était-ce utile?

La solution

Restez avec malloc sauf si vous avez une raison impérieuse d’utiliser quelque chose de différent. Il sera implémenté en dessous en termes de primitives d’allocation de mémoire de système d’exploitation, mais il n’ya aucun avantage réel à plonger vous-même vers cette couche.

Je pense que quelques appels d'API nécessitent un bloc de mémoire alloué depuis un segment de mémoire Windows, mais vous saurez quand vous les rencontrerez.

Ou si vous souhaitez faire quelque chose de plus avancé, comme utiliser la mémoire partagée, ou si vous devez contrôler les autorisations sur les pages de mémoire directement, vous devrez examiner les appels d'API Windows tels que VirtualAlloc.

Autres conseils

VirtualAlloc et ses amis peuvent vous donner un avantage si vous avez des tas de données à traiter ou si vous avez de la difficulté à créer votre propre gestionnaire de mémoire.

Autrement, il est plus facile et bien plus portable de simplement utiliser malloc ().

VirtualAlloc a cette fonctionnalité astucieuse appelée MEM_RESET, qui invalide les données dans un bloc de mémoire, mais les garde allouées. Cela signifie que si elle est paginée sur le disque, Windows ne se chargera pas de la rechercher dans le prochain accès. C'est bien si vous avez beaucoup de mégas de données qui peuvent soudainement devenir inutiles, mais vous aurez bientôt quelque chose d'autre à remplir le tampon.

Il fait également la différence entre la réservation d’espace adresse et la demande réelle de mémoire. Il y a des trucs sympas là-bas si vous avez une bonne raison de vous donner tant de peine.

Encore une chose: il est garanti que malloc () est portable (du moins pour toute implémentation ANSI-C) et plus élégant.

Dans certaines situations utilisant des fonctions telles que HeapAlloc, HeapFree vous facilitera la vie. Un exemple serait: une grosse application dans laquelle vous devez allouer de la mémoire dans un module (par exemple, dans library1.dll) et libérer cette mémoire dans le module principal (par exemple, programme.exe). Cela peut être fait en toute sécurité si vous utilisez les fonctions HeapAlloc, HeapResize et HeapFree, mais pas avec la bibliothèque d'exécution C (par exemple, malloc, free, redimensionner).

MAIS: Si vous n’avez pas de bonne raison, vous devriez vous en tenir aux fonctions malloc / free / resize. De même, si vous devez modifier les autorisations de la mémoire allouée (par exemple: créer si exécutable, etc.), vous devez utiliser des fonctions telles que VirtualAlloc, VirtualFree.

Vous pouvez créer un wrapper et laisser la possibilité de modifier les détails de la mise en œuvre. Vous pouvez même comparer les deux options avec votre code, puis décider.

Contrairement à Rob, je vais dans l'autre sens ... Depuis que j'ai choisi de coder contre WinAPI, j'utilise les fonctions natives au lieu de celles d'exécution C, qui ne sont de toute façon qu'une mince couche autour d'eux.

Avec HeapAlloc, vous pouvez avoir des tas distincts pour différentes tâches / sous-systèmes. Cela peut simplifier l’analyse de vidage d’applications volumineuses.

Avec malloc, vous ne pouvez utiliser qu'un seul tas, mais vous obtenez certaines optimisations d'allocation que les auteurs de tubes cathodiques ont implémentées sur le système d'exploitation HeapAlloc.

Accéder à VirtualAlloc ne vous rapporte pas grand-chose, sauf si vous souhaitez implémenter un gestionnaire de tas personnalisé (votre propre ensemble de fonctions Heap *).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top