Quelle est la pénalité de performance d'un ptr faible?

je suis en train de concevoir une structure d'objet pour un jeu, et l'organisation la plus naturelle dans mon cas est devenue un arbre. Etre un grand fan de smart pointers que j'utilise shared_ptr's exclusivement. Cependant, dans ce cas, les enfants de l'arbre auront besoin d'accéder à leur parent (exemple -- les êtres sur la carte doivent pouvoir accéder aux données de la carte -- ergo les données de leurs parents.

la direction de posséder est bien sûr qu'une carte possède ses êtres, donc tient des pointeurs partagés vers eux. Pour accéder à la nous avons cependant besoin d'un pointeur vers le parent -- la façon intelligente de pointer est d'utiliser une référence, ergo a weak_ptr.

cependant, j'ai lu une fois que verrouiller un weak_ptr est une opération coûteuse, peut-être que ce n'est pas vrai-mais considérant que l' weak_ptr sera verrouillé très souvent, je m'inquiète que ce design est condamné à de mauvaises performances.

d'Où la question:

Quelle est la pénalité de performance du verrouillage weak_ptr? Quelle est son importance?

21
demandé sur Kornel Kisielewicz 2010-05-01 02:40:08
la source

2 ответов

la fonction est De Stimuler 1.42 code source (<boost/shared_ptr/weak_ptr.hpp> ligne 155):

shared_ptr<T> lock() const // never throws
{
    return shared_ptr<element_type>( *this, boost::detail::sp_nothrow_tag() );
}

par conséquent, le commentaire de James McNellis est correct; c'est le coût de la copie-construire un shared_ptr.

12
répondu Billy ONeal 2010-05-01 02:53:11
la source

pour mon propre projet, j'ai pu améliorer considérablement la performance en ajoutant #define BOOST_DISABLE_THREADS avant tout stimuler comprend. Cela permet d'éviter la surcharge spinlock/mutex de weak_ptr:: lock qui dans mon projet était un goulot d'étranglement majeur. Comme le projet n'est pas multithreaded wrt boost, je pourrais le faire.

6
répondu Jochem Van Der Spek 2013-07-04 22:14:15
la source

Autres questions sur c++ performance boost weak-ptr