2009-06-05 10 views
5

¿Existe una colección que tenga conocimiento de shared_ptr internal y evita la copia periódica de elementos shared_ptr almacenados a favor de simplemente copiar su puntero débil interno?Colección especializada en shared_ptr

Esto significa implícitamente que no se realizarán llamadas de constructor/destructor y que no habrá manipulación de los contadores de referencia de shared_ptrs.

Respuesta

3

que es consciente de los componentes internos shared_ptr,

Eso debe responder a su pregunta allí mismo. Para estar al tanto de los aspectos internos, una colección de este tipo debería formar parte de las bibliotecas de punteros inteligentes de boost. Lamentablemente, no existe tal cosa.

Esto es de hecho un inconveniente para los punteros inteligentes. Recomendaría usar estructuras de datos que limiten la cantidad de copias hechas internamente. Las reasignaciones de vectores serán dolorosas. Tal vez un deque, que tiene una asignación basada en fragmentos, sería útil. Tenga en cuenta también que las implementaciones de vectores tienden a obtener memoria nueva en fragmentos que aumentan exponencialmente. Entonces no reasignan, digamos, cada 10 elementos. En su lugar, puede comenzar con 128 elementos, luego el vector se reserva 256, luego se mueve hasta 512, 1024, etc. Cada vez se dobla lo que se necesita.

A falta de esto, hay boost ptr_vector o preasignación de sus estructuras de datos con suficiente espacio para evitar la copia interna.

9

En teoría, después de que se adopta C++ 0x, los contenedores se modificarán para usar la semántica de movimiento cuando corresponda. En ese punto, shared_ptr también se puede modificar para tener un constructor de movimiento para minimizar el ajuste de recuento de referencia innecesario.

+2

En el borrador de C++ 0x, shared_ptr ya tiene este comportamiento. –

+0

¡Bueno, ahí lo tienes! :) – MSN