web-dev-qa-db-fra.com

intrusive_ptr en c ++ 11

Est-ce que C++ 11 a quelque chose d'équivalent à 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 exposer l'interface C est nécessaire pour des raisons de compatibilité. Je ne peux pas utiliser std::shared_ptr car je dois gérer l'objet via deux (ou plusieurs) pointeurs intelligents. Je n'arrive pas à trouver une solution avec quelque chose comme boost::intrusive_ptr.

34
Aarkan

Est-ce que c ++ 11 a quelque chose d'équivalent pour booster :: intrusive_ptr?

Non.

Il a std::make_shared Ce qui signifie que std::shared_ptr Est presque (voir note ci-dessous) aussi efficace qu'un pointeur intelligent intrusif, car les nombres de références seront stockés en mémoire adjacente à l'objet lui-même, améliorant 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é vers un objet appartenant à un shared_ptr, Mais cela ne vous permet pas pour gérer l'objet à l'aide de différents types de pointeurs intelligents.

shared_ptr S'attend à être entièrement responsable de la gestion de l'objet. Un type de pointeur intelligent différent pourrait uniquement gérer le décompte "fort" et non le décompte "faible", ce qui permettrait aux décomptes 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. L'objet et les informations de comptage de référence peuvent être alloués dans un seul bloc de mémoire lorsque make_shared Est utilisé, mais il y aura toujours deux comptes de référence (pour les comptes "forts" et "faibles"), ce qui n'est pas le cas des pointeurs intrusifs car ils ne prennent pas en charge un weak_ptr. De plus, l'objet shared_ptr Lui-même doit toujours stocker deux pointeurs (celui qui sera retourné par shared_ptr::get() et un autre pointeur vers le "bloc de contrôle" qui contient les comptes de référence et connaît la dynamique type de l'objet possédé) a donc une plus grande empreinte qu'un pointeur intrusif.

42
Jonathan Wakely