intrusive_ptr en c ++ 11

C ++ 11 a-t-il quelque chose d’équivalent pour boost::intrusive_ptr ?

Mon problème est que j’ai une interface de style C sur mon code C ++. Les deux côtés de l’interface peuvent utiliser C ++, mais l’exposition de l’interface C est requirejse pour des raisons de compatibilité. Je ne peux pas utiliser std::shared_ptr car je dois gérer l’object via deux pointeurs intelligents (ou plus). Je suis incapable de trouver une solution avec quelque chose comme boost::intrusive_ptr .

    Est-ce que c ++ 11 a quelque chose d’équivalent à boost :: intrusive_ptr?

    Non.

    std::make_shared signifie que std::shared_ptr est presque aussi efficace (voir la note ci-dessous) qu’un pointeur intelligent intrusif, car les comptes de références seront stockés à proximité de l’object lui-même, améliorant ainsi la localité de référence et l’utilisation du cache. . Il fournit également std::enable_shared_from_this qui vous permet de récupérer un std::shared_ptr lorsque vous ne disposez que d’un pointeur intégré sur un object appartenant à un shared_ptr , mais cela ne vous permet pas de gérer l’object à l’aide de différents types de pointeur intelligent. .

    shared_ptr s’attend à être entièrement responsable de la gestion de l’object. Un type de pointeur intelligent différent pourrait uniquement gérer le compte “fort” et non le compte “faible”, ce qui permettrait aux comptages de se désynchroniser et de casser les invariants de shared_ptr .


    Remarque: l’utilisation de make_shared permet à shared_ptr d’être presque aussi efficace qu’un pointeur intrusif. Les informations de comptage d’object et de référence peuvent être allouées dans un seul bloc de mémoire lorsque make_shared est utilisé, mais il restra deux comptages de référence (pour les comptages “fort” et “faible”), ce qui n’est pas le cas pour les pointeurs intrusifs. comme ils ne supportent pas un weak_ptr . De plus, l’object shared_ptr lui-même doit toujours stocker deux pointeurs (celui qui sera retourné par shared_ptr::get() et un autre pointeur sur le “bloc de contrôle” qui contient la référence compte et connaît le type dynamic de l’object appartenant). a donc une empreinte plus grande qu’un pointeur intrusif.