¿Qué es compartir implícitamente?

Estoy construyendo una biblioteca de motores de juegos en C ++. Hace un tiempo, estaba usando Qt para crear una aplicación y estaba bastante fascinado con su uso de Compartir implícito. Me pregunto si alguien podría explicar esta técnica con mayor detalle o podría ofrecer un ejemplo simple de esto en acción.

preguntado el 09 de enero de 11 a las 06:01

Dio un enlace a los documentos que proporciona una excelente explicación de cómo funciona. Incluso tiene una referencia a los documentos del hilo que explican cómo el recuento de referencias atómicas ayuda en aplicaciones multiproceso. Si algo aún no está claro, debe hacer una pregunta más detallada sobre ese algo. Y no olvide que siempre puede consultar las fuentes de Qt. -

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

Creo que el intercambio implícito es solo la implementación de Qt de Copiar en escrito. -

1 Respuestas

La idea clave detrás del intercambio implícito parece girar utilizando el término más común Copiar en escrito. La idea detrás del copy-on-write es que cada objeto sirva como envoltorio alrededor de un puntero a la implementación real. Cada objeto de implementación realiza un seguimiento del número de punteros en él. Siempre que se realiza una operación en el objeto contenedor, simplemente se reenvía al objeto de implementación, que hace el trabajo real.

La ventaja de este enfoque es que copiar y destruir estos objetos es barato. Para hacer una copia del objeto, simplemente creamos una nueva instancia de un contenedor, establecemos su puntero para que apunte al objeto de implementación y luego incrementamos el recuento del número 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 y luego vemos si alguien más está apuntando a la implementación. Si no, liberamos sus recursos. De lo contrario, no hacemos nada y asumimos que otra persona hará la limpieza más tarde.

El desafío de este enfoque es que significa que varios 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 podría cambiar potencialmente 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énticamente 1. Si ningún otro objeto hace referencia al objeto, entonces el la operación puede seguir adelante, no hay posibilidad de que los cambios se propaguen. Si hay al menos otro objeto que hace referencia a los datos, entonces el contenedor primero hace una copia profunda de la implementación para sí mismo y cambia su puntero para apuntar al nuevo objeto. Ahora sabemos que no se puede compartir y que los cambios se pueden realizar sin problemas.

Si desea ver algunos ejemplos de esto en acción, eche un vistazo a los ejemplos de conferencias 15.0 y 16.0 de Curso de introducción a la programación de C ++ de Stanford. Muestra cómo diseñar un objeto para contener una lista de palabras usando esta técnica.

¡Espero que esto ayude!

Respondido el 23 de Septiembre de 11 a las 00:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.