161 votes

C++ STL : dois-je conserver les objets entiers ou des pointeurs vers des objets ?

La conception d'un nouveau système à partir de zéro. Je vais être en utilisant la STL pour stocker des listes et des cartes de certains objets vivants.

Question: dois-je m'assurer que mes objets de copier des constructeurs et de stocker des copies d'objets dans mon conteneurs STL, ou est-il généralement de mieux gérer la vie et de la portée moi-même et juste stocker les pointeurs vers les objets de mon conteneurs STL?

Je me rends compte que c'est un peu court sur les détails, mais je suis à la recherche de la "théorique" meilleure réponse si elle existe, car je sais que ces deux solutions sont possibles.

Deux très désavantage évident de jouer avec des pointeurs: 1) je dois gérer l'allocation/désallocation de ces objets par moi-même dans une portée au-delà de la STL. 2) je ne peux pas créer un temp de l'objet sur la pile et de l'ajouter à mes conteneurs.

Est-il autre chose que je suis absent?

67voto

Torbjörn Gyllebring Points 8180

Puisque les gens sont carillon sur l’efficacité de l’utilisation de pointeurs.

Si vous envisagez d’utiliser un std::vector et si les mises à jour sont peu nombreux et souvent vous parcourez votre collection et il a un type polymorphe non stockage objet « copies » sera plus efficace car vous aurez meilleure localité de référence.

OTOH, si les mises à jour sont fréquentes stocker les pointeurs permettra d’économiser les frais de copie/déplacement.

46voto

Nick Haddad Points 4326

Cela dépend vraiment de votre situation.

Si vos objets sont petits, et de faire une copie de l'objet est léger, puis de stocker les données à l'intérieur d'un conteneur stl est simple et plus facile à gérer à mon avis parce que vous n'avez pas à vous soucier de gestion de durée de vie.

Si vous avez des objets de grande taille, et d'avoir un constructeur par défaut n'a pas de sens, ou des copies d'objets sont chers, puis les stocker avec les pointeurs est probablement la voie à suivre.

Si vous décidez d'utiliser des pointeurs vers des objets, prendre un coup d'oeil à l' Boost Pointeur Contenant de la Bibliothèque. Cette bibliothèque boost encapsule toutes les conteneurs STL pour une utilisation avec les objets alloués dynamiquement.

Chaque pointeur conteneur (par exemple ptr_vector) prend possession d'un objet lorsqu'il est ajouté au conteneur, et gère la durée de vie de ces objets pour vous. Vous avez également accès à tous les éléments dans un ptr_ conteneur par référence. Cela vous permet de faire des choses comme

class BigExpensive { ... }

// create a pointer vector
ptr_vector<BigExpensive> bigVector;
bigVector.push_back( new BigExpensive( "Lexus", 57700 ) );
bigVector.push_back( new BigExpensive( "House", 15000000 );

// get a reference to the first element
MyClass& expensiveItem = bigList[0];
expensiveItem.sell();

Ces classes envelopper les conteneurs STL et de travailler avec tous les algorithmes de la STL, ce qui est vraiment pratique.

Il y a aussi des installations pour le transfert de la propriété d'un pointeur dans le conteneur à l'appelant (par l'intermédiaire de la fonction de publication dans la plupart des conteneurs).

38voto

Si vous stockez des objets polymporhic, que vous devez toujours utiliser une collection de pointeurs de classe de base.

C’est si vous envisagez d’entreposer différents types dérivés dans votre collection, vous devez stocker les pointeurs ou obtenez mangées par le démon de tranchage.

22voto

EML Points 435

Désolé pour sauter dans les 3 ans après l'événement, mais une mise en garde...

Sur mon dernier gros projet, ma structure de données est un ensemble de relativement simples objets. Environ un an dans le projet, les besoins ont évolué, j'ai réalisé que l'objet qui doit réellement être polymorphe. Il a fallu quelques semaines de difficile et désagréable de la chirurgie du cerveau pour résoudre la structure de données à un ensemble de classes de base des pointeurs, et de gérer tous les dommages collatéraux dans l'objet de stockage, moulage, et ainsi de suite. Il m'a fallu quelques mois pour me convaincre que le nouveau code du travail. D'ailleurs, cela m'a fait réfléchir à la façon dont le bien-conçu C++de modèle d'objet.

Sur mon gros projet, ma structure de données est un ensemble de relativement simples objets. Environ un an dans le projet (qui se trouve être aujourd'hui), j'ai réalisé que l'objet doit être polymorphe. De retour sur le net, trouvé ce fil, et trouvé Nick lien à la, le coup de pouce pointeur contenant de la bibliothèque. C'est exactement ce que j'avais à écrire une dernière fois pour fixer le tout, donc je vais lui donner un aller, cette fois.

La morale, pour moi, de toute façon: si votre spec n'est pas 100% en fonte, en pierre, aller pour les pointeurs, et vous pouvez potentiellement gagner beaucoup de temps de travail par la suite.

19voto

Branan Points 1483

Pourquoi ne pas tirer le meilleur des deux mondes : faire un contenant des pointeurs intelligents (tels que `` ou `` ). Vous n’avez pas à gérer la mémoire, et il ne faut pas traiter les opérations de copie de gros.

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