2009-08-14 9 views
8

estoy consiguiendo confundido sobre el constructor de copia QList por el documentation.Qt 4.5 - QList :: QList (const QList &) - ¿Es este un constructor de copia profunda?

QList :: QList (const QList & otra) Construye una copia de otra.

Esta operación lleva tiempo constante, porque QList se comparte implícitamente. Esto hace que la devolución de una QList desde una función sea muy rápida. Si se modifica una instancia de compartida, será copiada (copiar-en-escribir), y eso toma tiempo lineal.

A continuación, en el enlace sobre el que se comparte de forma implícita, se habla de recuento de referencias y copia en escritura. ¿Es esto una copia profunda o solo una copia superficial?

Respuesta

5

Es una copia superficial. Una copia profunda de los datos ocurre entre bastidores la primera vez que llama a una función no const en la copia o en la lista original.

+0

... ¡o en la lista original! Básicamente, cada vez que se cambian los datos de la lista, se crea una copia profunda. – Thomi

+0

¡Oh, por supuesto! Gracias. Edité mi respuesta para evitar confusiones a quienes no leen comentarios. – rohanpm

+0

Simplemente me gustaría seguir que cometí un error: si tiene un QList o un QVector de punteros, no espere que el constructor de copia profunda predeterminado lo ayude a realizar nuevas instancias de lo que apuntan esos punteros ... – Extrakun

-2

AFAIK, al copiar el contenido (en escritura), llama al constructor de copia de cada elemento de la lista, como en el caso de std :: list.

3

Esta operación lleva tiempo constante, porque QList se comparte implícitamente.

Si no modifica la lista, ¡se comparten! Así que detrás de la escena, ¡lees en la misma dirección las informaciones!

Si se modifica una instancia compartida, que se copiará (copy-on-write), y que lleva tiempo lineal.

¡Pero si modifica la lista de copias, no hay otra opción que copie efectivamente la lista! Entonces, tienes un costo lineal dependiendo del tamaño de la lista.

from qt doc on copy on write and shared memory :

una copia profunda implica la duplicación de un objeto . Una copia superficial es una copia de referencia , es decir, solo un puntero a un bloque de datos compartido. Hacer una copia profunda puede ser costoso en términos de memoria y CPU. Hacer una copia superficial es muy rápido, porque solo implica establecer un puntero e incrementar el recuento de referencia.

Así que si no modifica la lista, lee la información en la misma dirección que la lista dada como parámetro, se denomina copia superficial. Y si lo modifica, tendrá una copia profunda de la lista.

2

El constructor de copia hace una copia rápida (poco profunda). Si luego modifica la lista original, o su copia, se realizará una copia profunda de los datos.

Si tiene alguna duda, le sugiero que vuelva a leer la documentación sobre la semántica de copiar y escribir.

Este es el mismo comportamiento que QString, QList, QArray y muchas otras clases de Qt.

Cuestiones relacionadas