Pregunta

scoped_ptr es no copiar capaz y está siendo borrado fuera del alcance. Por lo tanto, es una especie de shared_ptr restringido. Así parece, además de los casos en los que realmente necesita para restringir la operación de copia shared_ptr es mejor utilizar. Porque a veces no se sabe lo que necesita para crear una copia de su objeto o no. Entonces la pregunta es: además de los casos mencionados anteriormente, podríamos considerar que shared_ptr es mejor (o recomendado) para usar en lugar de scoped_ptr. Cómo funciona mucho más rápido de scoped_ptr shared_ptr, o tiene alguna ventaja?

Gracias!

¿Fue útil?

Solución

shared_ptr es más pesado que el scoped_ptr. Tiene que asignar y liberar un objeto de recuento de referencia, así como el objeto gestionado, y para manejar el recuento de referencias flujos seguros -. En una plataforma que trabajé, esto era una sobrecarga significativa

Mi consejo (en general) es utilizar el objeto más simple que satisfaga sus necesidades. Si necesita compartir referencia contado, utilice shared_ptr; si sólo necesita la eliminación automática una vez que haya terminado con una sola referencia, utilice scoped_ptr.

Otros consejos

Rendimiento - shared_ptr tiene más funcionalidad, pero también requiere una asignación adicional (también es más grande, pero que rara vez importa).

[editar] La segunda asignación se puede evitar mediante el uso de make_shared, pero luego weak_ptr llevará a cabo toda la asignación de toda incluso después se destruye el objeto, que puede ser un problema para objetos grandes.

Expresison de Intención utilizando scoped_ptr usted indica más explícitamente lo que quiere hacer. (En caso que quiera saber - que es una buena cosa :)). Si lo hace correctamente, shared_ptr también indicará "este objeto está destinado a vivir más allá de este ámbito"

Su propósito es diferente, por lo que, en muchos casos "shared_ptr vs scoped_ptr" No se trata en absoluto. Por supuesto, se puede utilizar un shared_ptr cuando todo lo que necesita es un scoped_ptr. Pero ¿cuál es el punto? shared_ptr probablemente tiene una sobrecarga un poco más grande con todo el conteo de referencia involucrado.

scoped_ptr funciona mucho más rápido de shared_ptr. Es lo correcto. shared_ptr siempre asigna memoria usando el asignador o por defecto asignador.

scoped_ptr tiene poco en común con shared_ptr, weak_ptr o unique_ptr, ya que sólo está haciendo caso muy especial de "recuento de referencias". No es algo que tendrá que muy a menudo en código bien diseñado, pero es una buena herramienta para tener disponible.

Básicamente, un scoped_ptr no es una cosa de referencia contado en absoluto. Más bien, es un objeto se crea en la pila (en el ámbito local) para que pueda hacer algo como esto:

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

Se tiende a ver este patrón más con mutex y otro de sincronización primatives- puedo declarar un "AutoLock" que va a bloquear el mutex pasado a él, entonces desbloquearlo cuando se elimina para girar el conjunto "{}" en un ámbito sección crítica.

Observe también que un 'scoped_ptr' solamente siempre tiene sentido cuando no se puede simplemente hacer una asignación de pila llanura de edad como "MiObjeto obj (params ..)" por alguna razón. Después de todo, lo que está haciendo es lo que le permite utilizar un objeto heap-asignado como si fuera una en la pila. Esto tiende a ser mucho más raro un caso de uso que la referencia de cómputo de shared_ptr y sus primos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top