shared_ptr vs scoped_ptr

scoped_ptr n’est pas scoped_ptr et est en cours de suppression en dehors de la scope. Donc, il est un peu restreint shared_ptr . Il semble donc en outre que dans les cas où vous avez vraiment besoin de restreindre l’opération de copie que shared_ptr est préférable d’utiliser. Parce que parfois vous ne savez pas que vous devez créer une copie de votre object ou non. La question est donc la suivante: outre les cas mentionnés ci-dessus, pourrions-nous considérer que shared_ptr est préférable (ou recommandé) à utiliser à la place de scoped_ptr . scoped_ptr fonctionne-t- scoped_ptr beaucoup plus rapidement avec shared_ptr ou présente-t-il des avantages?

Merci!

shared_ptr est plus lourd que scoped_ptr . Il doit allouer et libérer un object de comptage de références, ainsi que l’object géré, et gérer le comptage de références thread-safe – sur une plate-forme sur laquelle j’ai travaillé, cela représentait un temps système important.

Mon conseil (en général) est d’utiliser l’object le plus simple qui réponde à vos besoins. Si vous avez besoin d’un partage compté par référence, utilisez shared_ptr ; si vous avez juste besoin d’une suppression automatique une fois que vous avez terminé avec une seule référence, utilisez scoped_ptr .

Performanceshared_ptr a plus de fonctionnalités, mais nécessite également une allocation supplémentaire (elle est également plus grande, mais cela compte rarement).

[edit] La deuxième allocation peut être évitée en utilisant make_shared , mais alors weak_ptr conservera l’intégralité de l’allocation, même après la destruction de l’object, ce qui peut poser problème pour les gros objects.

En exprimant votre intention à l’ aide de scoped_ptr vous indiquez plus explicitement ce que vous voulez faire. (Au cas où vous vous demanderiez – c’est une bonne chose :)). Si vous faites cela correctement, shared_ptr indiquera également “cet object est destiné à vivre au-delà de cette scope”

Leur objective est différent, aussi, dans de nombreux cas, “shared_ptr vs scoped_ptr” n’est pas une question du tout. Bien sûr, vous pouvez utiliser un shared_ptr lorsque tout ce dont vous avez besoin est un scoped_ptr. Mais à quoi ça sert? shared_ptr a probablement une surcharge légèrement plus importante avec tout le comptage de références impliqué.

scoped_ptr fonctionne beaucoup plus rapidement à partir de shared_ptr . C’est juste. shared_ptr alloue toujours de la mémoire en utilisant votre allocateur ou votre allocateur par défaut.

Scoped_ptr a peu en commun avec shared_ptr, faible_ptr ou unique_ptr car il ne s’agit que du cas très particulier du “comptage de références”. Ce n’est pas quelque chose dont vous aurez souvent besoin dans un code bien conçu, mais c’est un bon outil à avoir.

Fondamentalement, scoped_ptr n’est pas du tout compté en termes de références. C’est plutôt un object que vous créez sur la stack (dans la scope locale) afin que vous puissiez faire quelque chose comme ceci:

  //Some enclosing scope- anything set off by "{}" or even a function: { scoped_ptr ptr = new MyObject( parameters...); } // When we hit this closing brace, "ptr" will delete the "MyObject" inside. 

Vous avez tendance à voir ce modèle plus souvent avec les mutex et les autres primitives de synchronisation. Je peux déclarer un “AutoLock” qui verrouille le mutex transmis, puis le déverrouille lorsqu’il supprime la totalité de la scope “{}” en une section critique.

Notez également qu’un ‘scoped_ptr’ n’a de sens que si vous ne pouvez pas simplement allouer une stack ancienne comme “MyObject obj (params ..)” pour une raison quelconque. Après tout, cela vous permet d’utiliser un object alloué par tas comme s’il s’agissait d’un object de la stack. Cela a tendance à être un cas d’utilisation beaucoup plus rare que le comptage de références de shared_ptr et de ses cousins.