¿Es posible, y si es así, cómo puedo crear una señal/ranura en Qt que sea una referencia constante a un shared_ptr? Quiero una señal que tiene este aspecto:Qt usando boost :: shared_ptr en una señal/ranura
void signal(shared_ptr<SomeClass> const &)
sé cómo hacer esto sin una referencia constante, que es simplemente el tipo shared_ptr<SomeClass>
pero por razones de eficiencia * Me gustaría evitar el copiado. La misma sintaxis para el tipo de referencia no está funcionando:
Q_DECLARE_METATYPE(shared_ptr<SomeClass> const &)
qRegisterMetaType<shared_ptr<SomeClass> const&>();
Muchas de las API estándar tienen QString const &
así que supongo que es fundamentalmente posible y que no puedo averiguar la sintaxis.
** El mayor problema para el rendimiento no es el tiempo de copia, pero la cantidad de exclusión mutua de bloqueo/desbloqueo que el objeto se copia a cada receptor - hay un montón de ellos. A medida que los hilos múltiples usan el objeto, esto introduce una notable disminución de velocidad/cuello de botella. Si el shared_ptr hace, de hecho, sólo tiene que utilizar un artículo atómica este costo también es trivial, la pregunta general acerca de referencia constante en las señales permanece sin embargo *
¿No pasar un shared_ptr como una const ref niega el punto de tener un shared_ptr en primer lugar? Simplemente pase un ref/puntero const al objeto en cuestión. – messenger
@messenger, la referencia constante es una optimización para evitar copiar el shared_ptr al llamar a funciones. Es un patrón bastante común. Si siempre pasa por valor (señales o funciones normales), shared_ptr se vuelve bastante costoso en comparación con los punteros normales. Los punteros normales no se pueden usar aquí ya que la vida útil del objeto desde el lado "emitir" no está garantizada. –
@ edA-qa mort-ora-y: ¿el boost shared_ptr usa un mutex? ¿¿¿Por qué eso??? ¿No son todos los incrementos/decrementos atómicos todo lo que necesitas? – mmmmmmmm