Compartición implícita
Muchas clases C++ en Qt utilizan la compartición implícita de datos para maximizar el uso de recursos y minimizar las copias. Las clases compartidas implícitamente son seguras y eficientes cuando se pasan como argumentos, porque sólo se pasa un puntero a los datos, y los datos se copian sólo si y cuando una función escribe en ellos, es decir, copy-on-write.
Visión general
Una clase compartida consiste en un puntero a un bloque de datos compartidos que contiene un contador de referencias y los datos.
Cuando se crea un objeto compartido, el contador de referencias se establece en 1. El contador de referencias se incrementa cada vez que un nuevo objeto hace referencia a los datos compartidos, y se decrementa cuando el objeto deja de hacer referencia a los datos compartidos. Los datos compartidos se borran cuando el contador de referencias llega a cero.
Cuando se trata de objetos compartidos, hay dos formas de copiar un objeto. Normalmente se habla de copias profundas y superficiales. Una copia profunda implica duplicar un objeto. Una copia superficial es una copia de referencia, es decir, sólo 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 sólo implica establecer un puntero e incrementar la cuenta de referencias.
La asignación de objetos (con operator=()) para objetos compartidos implícitamente se implementa utilizando copias superficiales.
La ventaja de compartir es que un programa no necesita duplicar datos innecesariamente, lo que se traduce en un menor uso de memoria y menos copias de datos. Los objetos pueden asignarse fácilmente, enviarse como argumentos de funciones y devolverse desde funciones.
La compartición implícita tiene lugar principalmente entre bastidores; el programador rara vez tiene que preocuparse de ello. Sin embargo, los iteradores contenedores de Qt tienen un comportamiento diferente a los de la STL. Leer Problema del iterador de compartición implícita.
En aplicaciones multihilo, la compartición implícita tiene lugar, como se explica en Threads and Implicitly Shared Classes.
Cuando implemente sus propias clases implícitamente compartidas, utilice las clases QSharedData y QSharedDataPointer.
Compartición implícita en detalle
La compartición implícita separa automáticamente el objeto de un bloque compartido si el objeto está a punto de cambiar y el recuento de referencias es mayor que uno. (Esto se llama a menudo copy-on-write o semántica de valor).
Una clase compartida implícitamente tiene el control de sus datos internos. En cualquier función miembro que modifique sus datos, se separa automáticamente antes de modificar los datos. Nótese, sin embargo, el caso especial de los iteradores contenedores; ver Problema de los iteradores compartidos implícitamente.
La clase QPen, que utiliza la compartición implícita, se separa de los datos compartidos en todas las funciones miembro que modifican los datos internos.
Fragmento de código:
void QPen::setCapStyle(Qt::PenCapStyle c) { if (d->capStyle == c) return; detach(); d->capStyle = c; } void QPen::detach() { d.detach(); }
Lista de clases
Las clases listadas a continuación se separan automáticamente de los datos comunes si un objeto está a punto de ser modificado. El programador ni siquiera notará que los objetos son compartidos. Por lo tanto, debe tratar las instancias separadas de las mismas como objetos separados. Siempre se comportarán como objetos separados, pero con la ventaja añadida de compartir datos siempre que sea posible. Por esta razón, puede pasar instancias de estas clases como argumentos a funciones por valor sin preocuparse por la sobrecarga de copiado.
Ejemplo:
QPixmap p1, p2; p1.load("image.bmp"); p2 = p1; // p1 and p2 share data QPainter paint; paint.begin(&p2); // cuts p2 loose from p1 paint.drawText(0,50, "Hi"); paint.end();
En este ejemplo, p1 y p2 comparten datos hasta que se llama a QPainter::begin() para p2, porque pintar un pixmap lo modificará.
Advertencia: Tenga cuidado al copiar un contenedor compartido implícitamente (QMap, QList, etc.) mientras utiliza un iterador estilo STL. Ver Problema del iterador compartido implícitamente.
Matriz de bits | |
Mapas de píxeles monocromos (profundidad de 1 bit) | |
Define el patrón de relleno de las formas dibujadas por QPainter | |
Matriz de bytes | |
Lista de matrices de bytes | |
Vista sobre una matriz de bytes con un subconjunto de sólo lectura de la API QByteArray | |
Clase de plantilla que proporciona una caché | |
Compara cadenas según un algoritmo de cotejo localizado | |
Puede utilizarse para acelerar la intercalación de cadenas | |
Define una posible opción de línea de comandos | |
Clase de plantilla que proporciona una caché contigua | |
Cursor del ratón con forma arbitraria | |
Hace referencia a una llamada asíncrona pendiente | |
Contiene un descriptor de archivo Unix | |
Funciones de fecha y hora | |
Flujo de salida para información de depuración | |
Acceso a estructuras de directorios y a su contenido | |
Almacena información sobre un registro de nombre de dominio | |
Almacena información sobre un registro de dirección de host | |
Almacenamiento de información sobre un registro DNS MX | |
Almacenamiento de información sobre un registro SRV de DNS | |
Almacenamiento de información sobre un registro TXT de DNS | |
Almacena información sobre un registro TLSA de DNS | |
API independiente del sistema operativo para recuperar información sobre entradas del sistema de archivos | |
Especifica una consulta para una fuente utilizada para dibujar texto | |
Información general sobre fuentes | |
Información sobre métricas de fuentes | |
Información sobre métricas de fuentes | |
Representa un eje variable en una fuente | |
Clase de conveniencia para simplificar la construcción de objetos QHttpMultiPart | |
Clase de conveniencia para simplificar la construcción de objetos QHttpPart | |
Describe los parámetros de un área o región que debe controlarse por proximidad | |
Contiene información recopilada sobre una posición, dirección y velocidad globales en un momento determinado | |
Contiene información básica sobre un satélite | |
Acceso directo a los glifos internos de una fuente | |
Se utiliza en combinación con QBrush para especificar rellenos de degradado. | |
Clase de plantilla que proporciona un diccionario basado en una tabla hash | |
Dirección IP | |
Controla los parámetros y ajustes de HTTP/1 | |
Controla los parámetros y ajustes de HTTP/2 | |
Contiene una parte del cuerpo que se utilizará dentro de un mensaje MIME HTTP multiparte | |
Iconos escalables en diferentes modos y estados | |
Representación de imagen independiente del hardware que permite el acceso directo a los datos de píxeles y puede utilizarse como dispositivo de pintura | |
Encapsula una matriz JSON | |
Forma de leer y escribir documentos JSON | |
Encapsula un objeto JSON | |
Se utiliza para informar de errores durante el análisis sintáctico de JSON | |
Encapsula un valor en JSON | |
Encapsula una secuencia de teclas como las utilizadas por los accesos directos | |
Clase de plantilla que proporciona listas enlazadas | |
Clase de plantilla que proporciona una matriz dinámica | |
Convierte entre números y sus representaciones de cadena en varios idiomas | |
Representa los datos que deben difundirse durante la publicidad Bluetooth Low Energy | |
Representa los parámetros utilizados para la publicidad de Bluetooth Low Energy | |
Se utiliza para configurar los datos del servicio GATT | |
Se utiliza al solicitar o notificar una actualización de los parámetros de una conexión Bluetooth LE | |
Se utiliza para crear datos de servicio GATT | |
Se utiliza para configurar datos de servicio GATT | |
Clase de plantilla que proporciona una matriz asociativa | |
Describe tipos de archivos o datos, representados por una cadena de tipo MIME | |
Representa un filtro de tema MQTT | |
Representa un nombre de tema MQTT | |
Tabla hash multivaluada | |
Clase de plantilla que proporciona una matriz asociativa con múltiples claves equivalentes | |
Almacena una dirección IP soportada por una interfaz de red, junto con su máscara de red y dirección de difusión asociadas | |
Información de caché | |
Contiene una cookie de red | |
Listado de direcciones IP e interfaces de red del host | |
Proxy de capa de red | |
Se utiliza para consultar la configuración proxy de un socket | |
Contiene una solicitud que se enviará con QNetworkAccessManager | |
Clase de conveniencia para agrupar puntos finales de servidores remotos que comparten propiedades comunes de solicitud de red | |
Envuelve un mensaje de depuración OpenGL | |
Representa una colección de rangos de páginas | |
Contiene grupos de colores para cada estado del widget | |
Define cómo un QPainter debe dibujar las líneas y contornos de las formas | |
Se utiliza para localizar datos en un modelo de datos | |
Dispositivo de pintura que graba y reproduce comandos QPainter | |
Representación de imagen fuera de pantalla que puede utilizarse como dispositivo de pintura | |
Lista de puntos con precisión entera | |
Lista de puntos con precisión de coma flotante | |
Contiene las variables de entorno que pueden pasarse a un programa | |
Contenedor genérico que proporciona una cola | |
Acceso a una única instancia física de una fuente | |
Correspondencia de patrones mediante expresiones regulares | |
Especifica una región de recorte para un pintor | |
Comparación de patrones mediante expresiones regulares | |
Resultados de la comparación de una QRegularExpression con una cadena | |
Iterador sobre los resultados de una comparación global de un objeto QRegularExpression con una cadena | |
Clase de plantilla que proporciona un conjunto basado en tablas hash | |
Manipula los campos de tablas y vistas de bases de datos SQL | |
Medio para ejecutar y manipular sentencias SQL | |
Encapsula un registro de base de datos | |
API conveniente para un certificado X509 | |
API para acceder a las extensiones de un certificado X509 | |
Representa un cifrado criptográfico SSL | |
Mantiene la configuración y el estado de una conexión SSL | |
Interfaz para parámetros Diffie-Hellman para servidores | |
Error SSL | |
Interfaz para claves privadas y públicas | |
Datos de autenticación para cifrados de claves precompartidas (PSK) | |
Clase de plantilla que proporciona una pila | |
Permite optimizar el dibujo del texto cuando éste y su disposición se actualizan raramente | |
Proporciona información sobre el almacenamiento y las unidades montadas actualmente | |
Cadena de caracteres Unicode | |
Lista de cadenas | |
Información de formato para bloques de texto en un QTextDocument | |
Forma de encontrar los límites de texto Unicode en una cadena | |
Información de formato para caracteres en un QTextDocument | |
Ofrece una API para acceder a QTextDocuments y modificarlos | |
Representa un fragmento de texto formateado de un QTextDocument | |
Información sobre el formato de un QTextDocument | |
Información sobre el formato de los marcos de un QTextDocument | |
Información de formato para imágenes en un QTextDocument | |
Información de formato para listas en un QTextDocument | |
Información de formato para celdas de tabla en un QTextDocument | |
Información de formato para tablas en un QTextDocument | |
Interfaz práctica para trabajar con URL | |
Manipulación de pares clave-valor en una consulta URL | |
Actúa como una unión para los tipos de datos Qt más comunes |
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.