2011-08-12 7 views
9

En el documento impulso de make_shared, que dice:¿Qué significa "única asignación" para significar impulso :: make_shared

Además de la comodidad y el estilo, tal función es también la excepción seguro y considerablemente más rápido porque puede use una asignación única para el objeto y su correspondiente bloque de control, eliminando una porción significativa de la sobrecarga de construcción de shared_ptr.

No entiendo el significado de "asignación única", ¿qué significa?

Respuesta

12

Una "asignación" significa un bloque de memoria obtenido de una llamada a un asignador.

Normalmente, la creación de un shared_ptr con el constructor del puntero asigna memoria para un "bloque de control", que contiene el recuento de referencias y el eliminador. Las copias de ese shared_ptr se refieren al mismo bloque de control, de modo que comparten el recuento de referencias. Por lo tanto, hay dos asignaciones en total: el objeto mismo y el bloque de control creado por shared_ptr.

Si crea el objeto y shared_ptr junto con make_shared, solo se realiza una asignación. Se puede pensar en esto como una sola estructura con dos miembros:

  1. El objeto que está siendo gestionado
  2. El bloque de control.
+0

El límite de flexibilidad es que no puede elegir el asignador para 'make_shared': siempre es' std :: allocator'. Por cierto, ¿cómo se las arreglan para que 'T *' todavía esté siempre en la parte superior de la estructura de datos? –

4

El shared_ptr necesita asignar espacio para el recuento de referencias. Esto significa que creará dinámicamente su objeto (una asignación) y lo pasará al shared_ptr que a su vez asignará el recuento (segunda asignación). make_shared realiza una sola asignación de un tamaño lo suficientemente grande y luego construye en su lugar tanto el recuento como el objeto.

Cuestiones relacionadas