160 votes

Pourquoi les bibliothèques C ++ et les frameworks n'utilisent-ils jamais de pointeurs intelligents?

J'ai lu dans quelques articles que les pointeurs ne devrait jamais être utilisée. Au lieu de cela, ils doivent toujours être enveloppé à l'intérieur des pointeurs intelligents, si elle est étendue ou partagé des pointeurs.

Cependant, j'ai remarqué que les cadres comme Qt, wxWidgets et des bibliothèques comme Boost de ne jamais revenir et à ne pas s'attendre à des pointeurs intelligents, comme s'ils n'étaient pas les utiliser du tout. Au lieu de cela, ils reviennent ou s'attendre à raw pointeurs. Est-il une raison pour que? Devrais-je rester à l'écart de pointeurs intelligents quand j'écris une API publique, et pourquoi?

Je me demandais pourquoi les pointeurs intelligents sont recommandées lors de la réalisation de nombreux grands projets semblent les éviter.

124voto

Jon Purdy Points 19408

Outre le fait que de nombreuses bibliothèques ont été écrits avant l'avènement de la norme des pointeurs intelligents, la principale raison est sans doute l'absence d'une norme ABI C++.

Si vous êtes à la rédaction d'un en-tête uniquement de la bibliothèque, vous pouvez passer des pointeurs intelligents et des conteneurs standard au contenu de votre coeur. Leur source est disponible à votre bibliothèque au moment de la compilation, de sorte que vous compter sur la stabilité de leurs interfaces, et non ceux de leurs implémentations.

Mais en raison de l'absence de standard ABI, en général, vous ne peut pas passer ces objets en toute sécurité à travers le module de limites. GCC shared_ptr est probablement différent d'un MSVC shared_ptr, lequel peut différer d'un processeur Intel shared_ptr. Même avec le même compilateur, ces classes ne sont pas garantis pour être compatible binaire entre les versions.

La ligne de fond est que si vous souhaitez distribuer un préconstruit de la version de votre bibliothèque, vous avez besoin d'un standard ABI sur qui compter. C n'a pas une, mais le compilateur, les vendeurs sont très bons sur l'interopérabilité entre les bibliothèques C pour une plate-forme donnée-il y a des normes de facto.

La situation n'est pas aussi bon pour le C++. Personne compilateurs peuvent gérer l'interopérabilité entre leurs propres binaires, vous avez donc la possibilité de distribuer une version pour chaque compilateur supporté, souvent GCC et MSVC. Mais à la lumière de cela, la plupart des bibliothèques, il suffit d'exporter une interface C-et que signifie premières pointeurs.

Non-bibliothèque de code doit, cependant, préfèrent généralement des pointeurs intelligents brut.

39voto

iammilind Points 29275

Il peut y avoir de nombreuses raisons. Pour la liste de quelques-uns d'entre eux:

  1. Les pointeurs intelligents sont devenus partie intégrante de la norme, tout récemment. Jusqu'alors ils faisaient partie des autres bibliothèques
  2. Leur utilisation principale est pour éviter les fuites de mémoire; de nombreuses bibliothèques ne disposent pas de leur propre gestion de la mémoire; en Général, ils fournissent utilitaires et les Api
  3. Ils sont mis en œuvre comme wrapper, car ils sont en fait des objets et non des pointeurs. Qui a plus de temps/coût de l'espace, par rapport à raw pointeurs; Les utilisateurs des bibliothèques peut ne pas vouloir avoir de ces frais généraux

Edit: l'Utilisation des pointeurs intelligents est un tout développeur de choix. Elle dépend de plusieurs facteurs.

  1. Dans la performance des systèmes critiques, vous ne voulez pas utiliser puce les pointeurs qui génère des frais généraux

  2. Le projet qui a besoin de la compatibilité descendante, vous ne voulez pas pour utiliser les pointeurs intelligents qui a le C++11 caractéristiques spécifiques

Edit2 Il est une chaîne de plusieurs downvotes en l'espace de 24 heures en raison de dessous de passage. Je n'arrive pas à comprendre pourquoi la réponse est downvoted même si, ci-dessous est juste un add-on de la suggestion et non une réponse.
Cependant, C++ facilite toujours vous d'avoir les options ouvertes. :) par exemple

template<typename T>
struct Pointer {
#ifdef <Cpp11>
  typedef std::unique_ptr<T> type;
#else
  typedef T* type;
#endif
};

Et dans votre code à utiliser:

Pointer<int>::type p;

Pour ceux qui disent qu'un pointeur intelligent et un pointeur brut sont différents, je suis d'accord avec cela. Le code ci-dessus était juste une idée où on peut écrire un code qui est interchangeable avec juste un #define, ce n'est pas une contrainte;

Par exemple, T* doit être supprimé explicitement, mais un pointeur intelligent ne. On peut avoir un type "modèle" Destroy() pour le gérer.

template<typename T>
void Destroy (T* p)
{
  delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
  // do nothing
}

et l'utiliser comme:

Destroy(p);

De la même manière, pour un pointeur brut, nous pouvons copier directement et de pointeur intelligent, nous pouvons utiliser l'opération spéciale.

Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));

Assign() est que:

template<typename T>
T* Assign (T *p)
{
  return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
  // use move sematics or whateve appropriate
}

35voto

Matthieu M. Points 101624

Il y a deux problèmes avec des pointeurs intelligents (avant C++11):

  • non-standards, de sorte que chaque bibliothèque ont tendance à réinventer sa propre (NIH syndrom & dépendances)
  • coût potentiel

Le défaut de pointeur intelligent, en ce qu'elle est gratuite, unique_ptr. Malheureusement, il nécessite C++11 sémantique de déplacement, qui n'est apparu que récemment. Tous les autres pointeurs intelligents ont un coût (shared_ptr, intrusive_ptr) ou avoir le moins que l'idéal de la sémantique (auto_ptr).

Avec C++11 au coin de la rue, portant un std::unique_ptr, on serait tenté de penser que c'est fini... je ne suis pas si optimiste.

Seuls quelques grands compilateurs mettre en œuvre la plupart de C++11, et seulement dans leurs dernières versions. Nous pouvons nous attendre à de grandes bibliothèques comme QT et coup de pouce pour être prêts afin de conserver la compatibilité avec le C++03 pendant un certain temps, ce qui peu s'oppose à l'adoption de la nouvelle et brillante des pointeurs intelligents.

13voto

Robot Mess Points 310

Vous ne devriez pas rester à l'écart de pointeurs intelligents, ils ont leur utilité, en particulier dans des applications où vous devez passer un objet autour de la.

Les bibliothèques ont tendance à simplement retourner une valeur ou remplir un objet. Ils n'ont généralement pas les objets qui doivent être utilisés dans beaucoup d'endroits, donc il n'est pas nécessaire pour eux d'utiliser des pointeurs intelligents (du moins pas dans leur interface, ils peuvent les utiliser en interne).

J'ai pu prendre comme exemple une bibliothèque, nous avons travaillé, où, après quelques mois de développement, j'ai réalisé que nous avons seulement utilisé les pointeurs les pointeurs intelligents dans quelques classes (de 3 à 5% de toutes les classes).

Passer des variables par référence a été suffisant dans la plupart des endroits, nous avons utilisé des pointeurs intelligents chaque fois que nous avions un objet qui pourrait être nulle, et des matières premières les pointeurs lors d'une bibliothèque que nous avons utilisé nous a forcés à nous.

Edit (je ne peux pas commenter à cause de ma réputation): passer des variables par référence est très flexible: si vous souhaitez que l'objet soit en lecture seule, vous pouvez utiliser const référence (vous pouvez toujours faire une méchante jette à être en mesure d'écrire l'objet), mais vous obtenez le maximum de protection possible (c'est la même chose avec des pointeurs intelligents). Mais je suis d'accord que c'est beaucoup plus agréable de simplement retourner l'objet.

8voto

Puppy Points 90818

Qt inutilement ré-inventé de nombreuses parties de la bibliothèque Standard dans une tentative de devenir Java. Je crois qu'il a effectivement ses propres pointeurs intelligents maintenant, mais en général, il est à peine un summum de la conception. wxWidgets, pour autant que je suis au courant, a été créée bien avant utilisable pointeurs intelligents ont été écrits.

Comme pour le coup de pouce, je m'attends à ce qu'ils utilisent des pointeurs intelligents, le cas échéant. Vous pourriez avoir à être plus précis.

En outre, n'oubliez pas que des pointeurs intelligents existent pour l'application de la propriété. Si l'API n'a pas de sémantique de propriété, alors pourquoi utiliser un pointeur intelligent?

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