Breve introducción: Estoy trabajando en el código multiproceso y tengo que compartir objetos asignados dinámicamente entre dos hilos. Para hacer mi código más limpio (y menos propenso a errores) quiero explícitamente "eliminar" objetos en cada hilo y es por eso que quiero usar shared_ptr
.Sobrecarga e implementación del uso de shared_ptr
Primera pregunta:
Quiero saber si la implementación de -> operator
en shared_ptr
tiene cierta sobrecarga adicional (por ejemplo, más grande que unique_ptr
) durante el tiempo de ejecución. Los objetos a los que me refiero son generalmente instancias de larga duración copiadas solo una vez después de la creación (cuando las distribuyo entre subprocesos), entonces solo accedo a los métodos y campos de estos objetos.
Soy consciente de que shared_ptr
solo protege el recuento de referencias.
Segunda pregunta:
¿Qué tan bien están optimizados en shared_ptr
libstdC++? ¿Siempre usa mutex o aprovecha las operaciones atómicas (me centro en las plataformas x86 y ARM)?
En una buena implementación de 'shared_ptr', debe haber cero sobrecarga al desreferenciar el puntero mediante' -> '. No estoy familiarizado con libstdC++, así que no puedo responder tu segunda pregunta. Sin embargo, tiene los encabezados, por lo que puede averiguar fácilmente al observar cómo se implementa. –
Si el código es multiproceso, el puntero compartido de GCC usa un 'std :: atomic' o algo así para el contador de referencia; si ese es un hardware verdadero (sin bloqueo) atómico depende de la versión del compilador, creo que esto fue mejorado en GCC 4.7.0. –
Copiar/asignar/salir del alcance tiene una sobrecarga adicional debido al incremento en el número de subprocesos del recuento. 'operator->' se ve exactamente igual a la del antiguo 'auto_ptr', es decir, se puede esperar que sea cero. – Damon