2009-11-30 5 views

Répondre

7

La principale raison pour laquelle j'ai dû surcharger new a été pour la performance. Un exemple est l'allocation d'un grand nombre de petits objets, ce qui est souvent assez lent avec un allocateur général, mais peut souvent être amélioré avec un allocateur personnalisé.

3

Eh bien, la gestion de la mémoire personnalisée et le débogage. C'est à peu près tout, et tout ce que vous pouvez en tirer aussi.

2

Vous développez peut-être une bibliothèque qui nécessite une étape supplémentaire dans l'initialisation de certains objets, la surcharge vous permet de le faire sans certains appels supplémentaires maladroits que l'utilisateur finirait par devoir taper.

2

Si vous travaillez avec SSE/SIMD, vous devez généralement votre mémoire à 4 mots-alignés, donc vous pouvez surcharger new pour les classes concernées à utiliser memalign() (alors que la valeur par défaut est new faire quelque chose d'équivalent à la plaine malloc()).

4

Il y a beaucoup de cas où l'opérateur nouveau doit être remplacé. Comme quelqu'un l'a dit, c'est principalement pour la gestion de la mémoire personnalisée.

Le principal exemple que j'ai personnellement traité concernait les systèmes embarqués.

Dans un système embarqué, l'allocation de mémoire dynamique est généralement un problème. Même si vous avez un système d'exploitation embarqué qui le supporte, vous avez toutes sortes de problèmes que vous pourriez avoir à traiter (par exemple, les systèmes embarqués doivent souvent être plus déterministes que leurs homologues PC. c'est supposé être en place pendant des années à la fois, auquel cas la fragmentation de la mémoire est un vrai problème). Pour cette raison, les systèmes embarqués ont tendance à interdire complètement l'allocation de mémoire dynamique. Bien sûr, dans la plupart des projets logiciels, vous avez besoin d'une forme de mémoire dynamique, et dans ce cas, vous implémentez généralement la vôtre (c'est-à-dire, ayez une sorte de mémoire que tous les threads peuvent demander, etc.).

Pour que les projets C++ utilisent cette allocation de mémoire dynamique laminée à la main de la manière la plus simple possible, j'ai vu des projets écraser operator new pour utiliser la méthode d'allocation du projet.

Questions connexes