2009-06-05 5 views
5

Existe-t-il une collection, consciente des internes shared_ptr, et évitant la copie régulière des éléments shared_ptr stockés en faveur de la simple copie de leur pointeur interne? Cela signifie implicitement qu'aucun appel de constructeur/destructeur ne sera effectué et qu'il n'y aura aucune manipulation des compteurs de référence de shared_ptrs.Collection spécialisée pour shared_ptr

Répondre

3

qui est au courant des internes de shared_ptr,

Cela devrait répondre à votre question là. Pour être au courant des internes, une telle collection devrait presque certainement faire partie des bibliothèques de pointeurs intelligentes de boost. Malheureusement, il n'y a pas une telle chose.

C'est en effet un inconvénient pour les pointeurs intelligents. Je recommanderais d'utiliser des structures de données qui limitent le nombre de copies effectuées en interne. Les réallocations de Vector seront douloureuses. Peut-être qu'une deque, qui a une allocation basée sur des morceaux, serait utile. Gardez également à l'esprit que les implémentations vectorielles ont tendance à acquérir une nouvelle mémoire en augmentant de façon exponentielle les morceaux. Donc, ils ne réaffectent pas, disons, tous les 10 éléments. Au lieu de cela, vous pouvez commencer avec 128 éléments, puis le vecteur se réserve 256, puis se déplace jusqu'à 512, 1024, etc. Chaque fois que vous doublez ce qui est nécessaire. En dehors de cela, ptr_vector de boost ou pré-allouer vos structures de données avec suffisamment d'espace pour empêcher la copie interne.

9

En théorie, après l'adoption de C++ 0x, les conteneurs seront modifiés pour utiliser la sémantique de déplacement, le cas échéant. À ce stade, shared_ptr peut également être modifié pour avoir un constructeur de déplacement afin de minimiser l'ajustement du compte de référence inutile.

+2

Dans le projet C++ 0x, shared_ptr a déjà ce comportement. –

+0

Eh bien alors voilà! :) – MSN

Questions connexes