Que faire dans la version spécifique de la classe de placement nouvelle?

voix
1

version spécifique de la classe de placement nouvelle peut être fournie même si vous ne pouvez pas remplacer celle qui est globale. Quels scénarios existent où une classe doit fournir son propre placement nouvel opérateur?

Même si ma classe ne met pas en œuvre un placement new les travaux de code suivant (en supposant abc aucun opérateur nouveau est surchargé).

char arr[100];

abc *pt = new(&arr)abc; 

Donc, j'interprète, il y a un emplacement par défaut nouveau, mais pour la classe, nous pouvons fournir à notre propre version de l'opérateur nouvelle, ma question est ce qui est le cas d'utilisation pour cela? Ce que l'on est censé faire autre puis retourner le même pointeur qui est passé? Y at-il par exemple / scénario utile que vous rencontrez?

Créé 27/08/2009 à 06:49
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
1

Malheureusement, autant que je sache, vous ne pouvez pas faire une surcharge spécifique de classe du placement standard nouvel opérateur, uniquement de placement personnalisé nouveaux opérateurs. Ainsi , un cas d' utilisation car il est un peu académique, mais je voulais l' utiliser pour interdire le placement nouveau sur la classe en utilisant = deletede 11 C ++. Cela fonctionne très bien avec la norme , operator newmais pas pour le placement nouveau.

Créé 19/09/2015 à 11:37
source utilisateur

voix
1

On dirait une question quiz ...

Plus rapide et plus maigre allocation
La raison la plus courante est beaucoup de petits objets qui doivent être alloués dynamiquement. Un allocateur personnalisé pour les objets de taille fixe a beaucoup moins que l' allocation de frais généraux d' un allocateur générique, ne souffre pas de la fragmentation, et est généralement plus rapide. ( De plus, lorsque ces allocations sont retirées du tas principal, ils ne contribuent pas à la fragmentation principale plus de tas).

Similairement, un allocateur non-libération (où vous pouvez allouer plusieurs objets, mais ne peut pas les libérer ensemble, uniquement en combinaison) est le système d'allocation la plus rapide possible, et ne pas les frais généraux (sauf l'alignement dans quelques rares cas). Il est logique si vous construisez une structure de données que vous modifiez jamais, supprimer uniquement dans son ensemble.

Une autre base allocateur
Une autre application alloue à partir d' un tas différent du tas C ++. Peut - être que les données contenues dans les objets doit être alloué en mémoire partagée pour échanger avec d' autres processus, ou il doit être passé à une fonction de système qui prend la propriété et requries l'utilisation d'un certain allocateur. (Notez que cela nécessite de mettre en œuvre le même mécanisme pour tous les sous-objets, aussi, il n'y a aucun moyen générique pour y parvenir).

Similairement (où je l'utilise) est lorsque vous créez un code à la volée. De nos jours, vous devez indiquer le système d'exploitation que les données sur cette page de mémoire est autorisé à courir, mais vous obtenez cette mémoire en morceaux assez gros (par exemple 4K). Donc, encore une fois, demander une page (4K) du système d'exploitation avec les droits d'exécution, puis allouer beaucoup de petits objets sur le dessus de celui-ci - en utilisant le placement nouveau.

Créé 27/08/2009 à 07:38
source utilisateur

voix
0

Je ne suis pas sûr que son possible de surcharger la mise en place nouvelle, seule la nouvelle régulière. Je ne peux pas penser à même un usage unique pour cela, puisque la seule mise en œuvre possible crée simplement un objet temporaire et memcp'ing à l'adresse de mémoire donnée - puisque vous n'êtes pas censé affecter une autre mémoire là - dedans, mais utiliser celle donnée.

Créé 09/09/2009 à 21:32
source utilisateur

voix
0

Directement de la bouche du cheval wiki . La section intitulée « Utilisation » met en évidence la nécessité d' une mise en place de nouveaux. Ce fil SO ici pourrait aussi aider

MISE À JOUR: Pour répondre précisément vous question; Vous pouvez utiliser le placement nouveau standard fourni par tête <new>si vous avez un pool de mémoire que vous souhaitez utiliser pour construire des objets d'une classe, mais ne voulez pas surcharger l' opérateur nouvelle pour toute la classe. Dans ce dernier cas , tous les objets de classe sont placés selon le placement surchargé nouveau tel que défini dans la classe

Créé 27/08/2009 à 06:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more