66 votes

Dois-je passer de l'utilisation de boost::shared_ptr à std::shared_ptr?

Je voudrais activer le support de C++0x dans GCC avec -std=c++0x. Je ne suis pas absolument nécessairement besoin de la prise en charge actuellement C++11 caractéristiques dans GCC 4.5 (et bientôt 4.6), mais je voudrais commencer à s'habituer à eux. Par exemple, dans un des rares endroits où je utiliser des itérateurs, auto type serait utile.

Mais encore une fois, je n'ai pas besoin d'une des fonctionnalités prises en charge. Le but ici est de m'encourager à intégrer les fonctionnalités de la nouvelle norme dans ma programmation "vocabulaire".

À partir de ce que vous savez du C++11, est-ce une bonne idée de l'activer dans GCC, puis l'embrasser, par exemple, le passage de l'aide d' boost::shared_ptr de std::shared_ptr exclusivement en tant que les deux ne se mélangent pas?

PS: je suis au courant de cette bonne question qui compare les différentes saveurs de la shared_ptr mais je vais demander à un niveau plus élevé des conseils sur l'utilisation avant la norme est finalisé. Une autre manière de dire que, quand un compilateur comme GCC, dit-il prend en charge un "expérimental", est-ce à dire que je suis susceptible de rencontrer bizarre erreurs lors de la compilation qui seront les principaux puits de temps et une source de cryptic questions sur StackOverflow?

Edit: j'ai décidé de revenir à partir de std::shared_ptr parce que je n'ai pas la confiance de son soutien dans GCC 4.5 comme indiqué par exemple dans cette question.

58voto

Billy ONeal Points 50631

Il ya un couple de raisons pour passer à l' std::shared_ptr:

  • Vous supprimez une dépendance sur un coup de pouce.
  • Les débogueurs. En fonction de votre compilateur et débogueur le débogueur peut être "smart" sur std::shared_ptr et de montrer le fait de s'opposer directement, où il ne serait pas pour dire, de stimuler la mise en œuvre. Au moins dans Visual Studio, std::shared_ptr ressemble à une plaine pointeur dans le débogueur, tout en boost::shared_ptr expose un tas de boost de la les entrailles.
  • D'autres nouvelles fonctionnalités définies dans votre lié question.
  • Vous obtenez une mise en œuvre qui est presque garanti pour être déplacez-la sémantique activé, ce qui pourrait permettre d'économiser quelques refcount modifications. (Théoriquement, je n'ai pas testé moi-même) Que de 2014-07-22 au moins, boost::shared_ptr comprend la sémantique de déplacement.
  • std::shared_ptr utilise correctement delete [] sur les types de tableau, alors que boost::shared_ptr provoque un comportement indéfini dans de tels cas (vous devez utiliser shared_array ou personnalisé deleter) (en Fait, je corrige la position des mains. Voir ce -- la spécialisation pour ce qui est de unique_ptr seulement, et non pas shared_ptr.)

Et l'un des principaux flagrante de raison de ne pas:

  • Vous seriez limiter vous-même à C++11 compilateur et de la bibliothèque standard implémentations.

Enfin, vous n'avez pas vraiment le choix. (Et si vous ciblez un compilateur spécifique de la série (par exemple, MSVC et GCC), vous pouvez facilement étendre cette mesure à utiliser std::tr1::shared_ptr lorsqu'ils sont disponibles. Malheureusement, il ne semble pas être un moyen standard pour détecter TR1 de soutien)

#if __cplusplus > 199711L
#include <memory>
namespace MyProject
{
    using std::shared_ptr;
}
#else
#include <boost/shared_ptr.hpp>
namespace MyProject
{
    using boost::shared_ptr;
}
#endif

13voto

nbt Points 15965

Je suppose que cela dépend de combien vous utilisez le boost. Personnellement, je ne l'utiliser très peu (en fait, le nombre aléatoire de la bibliothèque, dans un seul projet). J'ai récemment commencé à utiliser -std=c++0x pour mes autres projets, et j'utilise la nouvelle std:: les fonctions de la bibliothèque comme shared_ptr. J'aime mes projets pour avoir le minimum de dépendances, donc je préfère être dépend du compilateur, de la bibliothèque standard de mise en œuvre que sur un coup de pouce.

Mais je ne pense pas qu'il y est un one-size-fits-all réponse à cette question.

12voto

Puppy Points 90818

Vous devriez toujours utiliser std::shared_ptr dans la mesure du possible, si elle est disponible, au lieu de la stimuler. C'est fondamentalement parce que toutes les nouvelles interfaces qui utilisent shared_ptr utilisera le Standard ptr.

7voto

Chris Mennie Points 499

Ce n'est probablement pas une mauvaise idée de commencer à entrer dans l'habitude de l'utiliser std::shared_ptr lorsque cela est autorisé par le compilateur. Depuis l'interface est la même que du coup de pouce shared_ptr vous pouvez toujours revenir en arrière si vous avez besoin de.

4voto

dhaffey Points 758

Outre la mise en œuvre de la cohérence, boost::shared_ptr actuellement conserve au moins deux de niche avantages par rapport std::shared_ptr:

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