2011-01-09 25 views
12

Estoy construyendo una biblioteca de motor de juegos en C++. Hace un tiempo estaba usando Qt para construir una aplicación y estaba fascinado con su uso de Implicit Sharing. Me pregunto si alguien podría explicar esta técnica en mayor detalle o podría ofrecer un ejemplo simple de esto en acción.¿Qué es el intercambio implícito?

+5

Dio un enlace a los documentos que proporcionan una excelente explicación de cómo funciona. Incluso tiene una referencia a [los documentos de hilos que explican cómo ayuda el conteo de referencias atómicas en aplicaciones de subprocesos múltiples] (http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes) Si algo aún no está claro, debe hacer una pregunta más detallada sobre ese algo. Y no olvides que siempre puedes mirar las fuentes de Qt. –

+0

El otro nombre para * compartir implícitamente * es * copy-on-write *. Es posible que desee echar un vistazo a las preguntas que mencionan este otro nombre en SO, como por ejemplo este: http://stackoverflow.com/questions/628938/what-is-copy-on-write –

+0

Creo que el intercambio implícito es solo Qt implementación de [copy-on-write] (https://en.wikipedia.org/wiki/Copy-on-write). – HelloGoodbye

Respuesta

31

La idea clave detrás del uso compartido implícito parece darse la vuelta utilizando el término más común copy-on-write. La idea detrás del copy-on-write es hacer que cada objeto sirva como un contenedor alrededor de un puntero a la implementación real. Cada objeto de implementación realiza un seguimiento de la cantidad de punteros que contiene. Cada vez que se realiza una operación en el objeto envoltorio, simplemente se reenvía al objeto de implementación, que realiza el trabajo real.

La ventaja de este enfoque es que copiar y destruir estos objetos es barato. Para hacer una copia del objeto, simplemente hacemos una nueva instancia de un contenedor, establecemos su puntero para apuntar al objeto de implementación y luego incrementamos el recuento de la cantidad de punteros al objeto (esto a veces se llama el recuento de referencias , por cierto). La destrucción es similar: reducimos el recuento de referencias en uno, luego vemos si alguien más está apuntando a la implementación. Si no, liberamos sus recursos. De lo contrario, no hacemos nada y simplemente suponemos que alguien más hará la limpieza más tarde.

El desafío en este enfoque es que significa que múltiples objetos diferentes apuntarán a la misma implementación. Esto significa que si alguien termina haciendo un cambio en la implementación, cada objeto que haga referencia a esa implementación verá los cambios, un problema muy serio. Para solucionar esto, cada vez que se realiza una operación que potencialmente podría cambiar la implementación, la operación verifica si otros objetos también hacen referencia a la implementación al ver si el recuento de referencias es idéntico a 1. Si ningún otro objeto hace referencia al objeto, entonces la la operación puede continuar, no hay posibilidad de que los cambios se propaguen. Si hay al menos otro objeto que hace referencia a los datos, el envoltorio primero hace una copia profunda de la implementación por sí mismo y cambia su puntero para apuntar al nuevo objeto. Ahora sabemos que no se puede compartir, y los cambios se pueden hacer sin problemas.

Si desea ver algunos ejemplos de esto en acción, eche un vistazo a los ejemplos de clase 15.0 y 16.0 del Stanford's introductory C++ programming course. Muestra cómo diseñar un objeto para contener una lista de palabras usando esta técnica.

Espero que esto ayude!

Cuestiones relacionadas