0
votes

Création de types de modèles sans nouveau / Supprimer

J'ai une classe d'objet C ++ comme ceci: xxx

composant s ajouté à objet de classe est Supprimer d sur une autre fonction qui n'est pas liée à ma question. Afaik faisant beaucoup de neuf / Supprimer appels (allocations de tas) Blesser les performances et supposé qu'il devrait y avoir 20/30 (ou même plus) Objets S avec 3-10 Object :: Ajouter sur chacun. Je pensais que je pouvais juste appeler t -s constructeur sans nouveau , puis sur static_cast (& valeur) , mais le composant ajouté sur la carte est "invalide", ce qui signifie tous les membres du T (ex. Sur une classe avec des membres int , ils sont tous égaux à 0 au lieu d'une valeur personnalisée transmise son constructeur). Je suis conscient que valeur est hors de portée et le pointeur sur la carte devient pendante, mais je ne trouve pas un moyen d'instancer t Objets sans appeler Nouveau ou sans les déclarer comme statique . Y a-t-il un moyen de faire cela?

Edit: Si je déclare valeur comme statique , tout fonctionne comme prévu, donc je suppose que c'est un problème de vie liée à valeur .


2 commentaires

Pouvez-vous expliquer le problème sous-jacent que vous essayez de résoudre?


Désolé mon mauvais. J'essaie de supprimer ces nouveau / Supprimer les appels , mais comme @Oolaf DIetsche mentionné, si j'écris l'extrait qu'il a partagé, la valeur la variable Sortez hors de portée et Composants La carte contiendrait des pointeurs suspendus. Si je déclare valeur comme statique , il aurait la durée de vie des programmes et le problème résolu, mais je veux trouver un moyen de créer moins cher t s et les stocker sur composants Carte (autre que d'utiliser Nouveau / statique ).


3 Réponses :


1
votes

Je suppose que vous pensez à cela comme la voie alternative de créer vos objets xxx

ceci crée une variable locale sur la pile. Faire la mission alors, stocke un pointeur à une variable locale dans la carte .

Lorsque vous laissez la méthode add () , l'objet local sera Détruit, et vous avez un pointeur pendant sur la carte. Ceci, à son tour, vous mordre finalement.


Tant que vous voulez stocker des pointeurs, il n'y a aucun moyen de ne pas courir neuf et de la suppression. Vous pouvez l'atténuer un peu avec une sorte de Pool de mémoire .

Si vous pouvez également stocker des objets au lieu de pointeurs sur la carte, vous pouvez créer les composants en place avec std :: Map :: Emplace . Lorsque vous faites cela, vous devez également supprimer l'appel sur Supprimer et nettoyer les objets d'une autre manière.


1 commentaires

Je vois. Le code fonctionne bien si j'ajoute statique lors de la construction (CODE> (STH comme: C ++ statique t valeur {std :: Forward (args) ... }; c'est certainement un problème de vie. J'ai mis à jour les informations de la question, mais je dois toujours trouver qc moins cher que certains std :: map s de statique variables.



1
votes

Essayer d'éviter les allocations de tas avant d'avoir prouvé qu'ils blessent en effet la performance de vos programmes n'est pas une bonne approche à mon avis. Si tel était le cas, vous devriez probablement vous débarrasser de std :: map dans votre code aussi. Cela étant dit, si vous voulez vraiment n'avoir aucun nouveau / Supprimer Appels, cela peut être effectué, mais nécessite une énumération explicite du composant les types. Quelque chose comme ça pourrait être ce que vous recherchez: xxx

composant énumère tous les types de composants connus, cela permet d'éviter une allocation dynamique dans objet , mais peut augmenter l'utilisation de la mémoire, car la mémoire utilisée pour un seul objet est grossièrement Number_of_component_types * Taille_of_larges_Component .


1 commentaires

J'ai besoin des structures déroulantes du composant pour contenir des données spécifiques (ex. Une classe d'animationComponce conserve des données liées à l'animation). Le composant de base était utilisé pour avoir un point commun pour tous les composants afin que je puisse écrire un concept à utiliser dans Ajouter . Je sais que je suis peut-être franchir la ligne avec mes "exigences", mais composant Les classes autorisées sont censées être écrites à partir de n'importe quel fichier que #include s "objet.h "(Le fichier où composant de classe est déclaré). Cela signifie que à l'aide de composant doit être modifié par quiconque, qui est suone d'erreur sur mon cas.



1
votes

tandis que les autres réponses ont clairement indiqué ce que le problème est que je veux faire une proposition en quoi vous pourriez vous déplacer dans son intégralité.

Vous savez à la compilation Quels types possibles seront sur la carte de Mosz, puisque vous Sachez quelle instantanation du modèle utilisé. Vous pouvez donc vous débarrasser de la carte et faire tout dans un temps de compilation. xxx

Bien sûr que cela vous oblige à collecter tous les objets possibles lorsque vous créez l'objet, mais cela Pas plus d'info que vous devez avoir juste plus pratique.

Vous pouvez ajouter la surcharge suivante pour Ajouter pour que les erreurs facilitent la lecture xxx


2 commentaires

En tant que mater de fait, je ne sais pas à la compilation des types exacts que la carte tiendra la carte, mais je sais que ces types sont tous dérivés d'un composant vide , donc j'ai écrit Modèle plutôt que modèle . L'idée est que moi ou tout "utilisateur" du code peut dériver leur propre composant Types de composant de classe . En outre, la solution est belle pensée et je pense que std :: facultatif peut être retiré facilement du code sans aucun effet secondaire.


Vous ne pouvez supprimer que le en option si vous pouvez construire toutes les classes lorsque vous construisez l'objet (E.G. si tout est constructible par défaut). Mais le facultatif n'est pas un problème, il ne fait pas d'allocations de tas, mais est essentiellement juste assez d'espace pour l'objet et un drapeau si c'est là ou non. Et si vous ne savez pas quels composants peuvent être là (non, mais peut être), vous avez un problème avec votre code ci-dessus. Depuis chaque composant que vous avez, vous devez instancier le modèle ajouter avec le type de bon type comme T.