54 votes

Aucune raison de la surcharge de la global new et delete?

Sauf si vous êtes à la programmation des parties d'un OS ou d'un système embarqué sont là toutes les raisons de le faire? J'imagine que pour certaines classes qui sont créés et détruits fréquemment une surcharge de la mémoire de fonctions de gestion ou de l'introduction d'un pool d'objets de diminuer les frais généraux, mais en faisant ces choses à l'échelle mondiale?

Plus
Je viens de trouver un bug dans une surcharge de supprimer la fonction de la mémoire n'a pas toujours été libéré. Et qui était dans une sorte de mémoire des applications critiques. Aussi, la désactivation de ces surcharges diminue les performances par de ~0,5% seulement.

79voto

leander Points 6363

Nous surcharger le mondial nouveau et supprimer des opérateurs où je travaille pour de nombreuses raisons:

  • le regroupement de toutes les petites allocations -- diminue les frais généraux, diminue la fragmentation, peut augmenter les performances pour les petits-alloc-lourds des applications
  • encadrement des allocations avec une durée de vie -- ignorer tout le libère jusqu'à la fin de cette période, alors libre tous ensemble (il est vrai que nous ne la présente plus, avec la surcharge de l'opérateur local que global)
  • l'alignement de réglage -- à cacheline limites, etc
  • alloc de remplissage -- aider à exposer l'utilisation de variables non initialisées
  • gratuit remplir -- aider à exposer l'utilisation d'précédemment supprimés de la mémoire
  • retard de libre -- l'augmentation de l'efficacité de la libre de remplir, à l'occasion d'augmentation de la performance
  • les sentinelles ou aux poteaux de votre clôture -- contribuant à faire connaître les dépassements de mémoire tampon, flux de données, et parfois sauvage pointeur
  • la redirection des allocations -- pour tenir compte de NUMA, spécial zones de mémoire, ou même à garder à l'écart des systèmes distincts de la mémoire (par exemple de script incorporé langues ou Dsl)
  • la collecte des ordures ou le nettoyage -- encore utile pour ceux qui sont intégrés les langages de script
  • tas de vérification -- vous pouvez marcher à travers les tas de structure de données, tous les N allocations/libère pour s'assurer que tout semble ok
  • de la comptabilité, y compris la fuite de suivi et d'utilisation des instantanés et des statistiques (piles, la répartition de l'âge, etc)

L'idée de new/delete comptabilité est vraiment puissant et flexible: vous pouvez, par exemple, d'enregistrer l'ensemble de la pile des appels pour le thread actif, chaque fois qu'une alloc se produit, et l'ensemble de statistiques à ce sujet. Vous pourriez expédier la pile d'info sur le réseau si vous n'avez pas l'espace pour conserver localement pour quelque raison que ce soit. Les types d'informations que vous pouvez recueillir ici ne sont limitées que par votre imagination (et de la performance, bien sûr).

Nous utilisons globale surcharges parce que c'est commode pour accrocher beaucoup de communes de la fonctionnalité de débogage, ainsi que de faire le balayage des améliorations dans l'ensemble de l'application, basé sur les statistiques que nous recueillons à partir de ces mêmes surcharges.

Nous n'avons toujours utiliser des allocateurs pour les différents types trop; dans de nombreux cas, l'accélération ou fonctionnalités que vous pouvez obtenir en fournissant des allocateurs, par exemple, un seul point d'utilisation de la STL structure de données dépasse de loin le général speedup vous pouvez obtenir à partir de la global des surcharges.

Jetez un oeil à certains des allocateurs et le débogage de systèmes qui sont là pour le C/C++ et vous aurez rapidement de venir avec ces idées, et d'autres:

(Un vieux mais séminal livre est Écrit Solide Code, qui présente de nombreuses raisons que vous pourriez fournir des allocateurs en C, dont la plupart sont encore très pertinentes.)

Évidemment, si vous pouvez utiliser l'un de ces beaux outils que vous aurez envie de le faire plutôt que de rouler votre propre.

Il y a des situations dans lesquelles il est plus rapide, plus facile, moins d'une entreprise/juridique tracas, rien n'est disponible pour votre plate-forme encore, ou tout simplement plus instructif: creuser et à écrire un mondial de la surcharge.

26voto

GManNickG Points 155079

La raison la plus courante pour la surcharge de new et delete sont tout simplement pour vérifier les fuites de mémoire, et la mémoire des statistiques d'utilisation. Notez que la "fuite de mémoire" est habituellement généralisé à des erreurs de mémoire. Vous pouvez vérifier pour des choses telles que le double supprime et des dépassements de mémoire tampon.

L'utilise après qui sont généralement de la mémoire-les systèmes de répartition, tels que la collecte des ordures, et de mise en commun.

Tous les autres cas sont juste des choses spécifiques, mentionné dans d'autres réponses (enregistrement sur le disque, le noyau de l'utilisation).

15voto

Crashworks Points 22920

En plus des autres usages mentionnés ici, comme la mémoire de marquage, c'est aussi le seul moyen de forcer toutes les affectations dans votre application afin de passer par blocs fixes de répartition, ce qui a des implications énormes pour la performance et la fragmentation.

Par exemple, vous pouvez avoir une série de pools de mémoire fixe avec des tailles de blocs. Primordial global new vous permet de diriger tous les 61-allocations d'octets, par exemple, à la piscine avec 64 octets, blocs, tous 768-1024 octet allocations à la 1024b-bloc de la piscine, tous ces ci-dessus pour le 2048 octets du bloc de la piscine, et rien de plus de 8 ko pour le général en lambeaux tas.

Parce bloc fixe allocateurs sont beaucoup plus rapides et moins sujettes à la fragmentation de l'allocation de bon gré mal gré dans le tas, ce qui permet à la force même de merde 3d partie de code à allouer de vos piscines et pas caca partout dans l'espace d'adressage.

Cela se fait souvent dans des systèmes qui sont le temps et l'espace critique, comme les jeux. 280Z28, Meeh, et Dan Olson ont décrit pourquoi.

10voto

280Z28 Points 49515

UnrealEngine3 surcharges mondial nouveau et supprimer dans le cadre de son cœur de gestion de la mémoire système. Il y a plusieurs allocateurs qui proposent des fonctionnalités différentes (profilage, performances,...). et ils ont besoin de toutes les allocations d'aller à travers elle.

Edit: Pour mon propre code, je n'en ai jamais le faire en dernier recours. Et j'entends par là que j'aurais presque positivement de ne jamais l'utiliser. Mais mes projets personnels sont évidemment beaucoup plus petits/des exigences très différentes.

6voto

cwap Points 6098

Certains en temps réel des systèmes de surcharge pour éviter qu'elles soient utilisées après init..

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