Sur cette page

Partage implicite

De nombreuses classes C++ dans Qt utilisent le partage implicite de données pour maximiser l'utilisation des ressources et minimiser les copies. Les classes implicitement partagées sont à la fois sûres et efficaces lorsqu'elles sont transmises en tant qu'arguments, car seul un pointeur sur les données est transmis, et les données ne sont copiées que si et quand une fonction les écrit, c'est-à-dire qu'elles sont copiées sur l'écriture.

Vue d'ensemble

Une classe partagée consiste en un pointeur vers un bloc de données partagé qui contient un nombre de références et les données.

Lorsqu'un objet partagé est créé, le nombre de références est fixé à 1. Le nombre de références est incrémenté chaque fois qu'un nouvel objet fait référence aux données partagées, et décrémenté lorsque l'objet déréférence les données partagées. Les données partagées sont supprimées lorsque le nombre de références devient nul.

Lorsqu'il s'agit d'objets partagés, il existe deux façons de copier un objet. On parle généralement de copies profondes et de copies superficielles. Une copie profonde implique la duplication d'un objet. Une copie superficielle est une copie de référence, c'est-à-dire un simple pointeur vers un bloc de données partagé. La réalisation d'une copie profonde peut être coûteuse en termes de mémoire et d'unité centrale. La réalisation d'une copie superficielle est très rapide, car elle n'implique que la mise en place d'un pointeur et l'incrémentation du nombre de références.

L'affectation d'objets (avec operator=()) pour les objets implicitement partagés est implémentée en utilisant des copies peu profondes.

L'avantage du partage est qu'un programme n'a pas besoin de dupliquer inutilement les données, ce qui réduit l'utilisation de la mémoire et la copie des données. Les objets peuvent facilement être assignés, envoyés en tant qu'arguments de fonction et renvoyés par des fonctions.

Le partage implicite s'effectue principalement dans les coulisses ; le programmeur a rarement besoin de s'en préoccuper. Cependant, les itérateurs de conteneurs de Qt ont un comportement différent de ceux de la STL. Lire le problème du partage implicite des itérateurs.

Dans les applications multithread, le partage implicite a lieu, comme expliqué dans Threads and Implicitly Shared Classes.

Lorsque vous implémentez vos propres classes implicitement partagées, utilisez les classes QSharedData et QSharedDataPointer.

Le partage implicite en détail

Le partage implicite détache automatiquement l'objet d'un bloc partagé si l'objet est sur le point d'être modifié et que le nombre de références est supérieur à un. (On parle souvent de copie à l'écriture ou de sémantique des valeurs).

Une classe implicitement partagée a le contrôle de ses données internes. Dans toutes les fonctions membres qui modifient ses données, elle se détache automatiquement avant de modifier les données. Notez toutefois le cas particulier des itérateurs de conteneurs ; voir le problème des itérateurs à partage implicite.

La classe QPen, qui utilise le partage implicite, se détache des données partagées dans toutes les fonctions membres qui modifient les données internes.

Fragment de code :

void QPen::setCapStyle(Qt::PenCapStyle c)
{
    if (d->capStyle == c)
        return;
    detach();
    d->capStyle = c;
}

void QPen::detach()
{
    d.detach();
}

Liste des classes

Les classes énumérées ci-dessous se détachent automatiquement des données communes si un objet est sur le point d'être modifié. Le programmeur ne remarquera même pas que les objets sont partagés. Vous devez donc traiter les instances séparées de ces classes comme des objets distincts. Ils se comporteront toujours comme des objets distincts, mais avec l'avantage supplémentaire de partager des données dans la mesure du possible. C'est pourquoi vous pouvez passer des instances de ces classes comme arguments à des fonctions par valeur sans vous soucier de la surcharge de copie.

Exemple :

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();

Dans cet exemple, p1 et p2 partagent des données jusqu'à ce que QPainter::begin() soit appelé pour p2, parce que la peinture d'un pixmap le modifiera.

Attention : Attention à la copie d'un conteneur implicitement partagé (QMap, QList, etc.) lorsque vous utilisez un itérateur de type STL. Voir le problème du partage implicite de l'itérateur.

QBitArray

Tableau de bits

QBitmap

Pixmaps monochromes (profondeur de 1 bit)

QBrush

Définit le motif de remplissage des formes dessinées par QPainter.

QByteArray

Tableau d'octets

QByteArrayList

Liste de tableaux d'octets

QByteArrayView

Vue sur un tableau d'octets avec un sous-ensemble en lecture seule de l'API QByteArray

QCache

Classe modèle qui fournit un cache

QCollator

Compare les chaînes de caractères selon un algorithme de collationnement localisé

QCollatorSortKey

Peut être utilisée pour accélérer la collation des chaînes de caractères

QCommandLineOption

Définit une option de ligne de commande possible

QContiguousCache

Classe de modèle qui fournit un cache contigu

QCursor

Curseur de souris de forme arbitraire

QDBusPendingCall

Fait référence à un appel asynchrone en attente

QDBusUnixFileDescriptor

Contient un descripteur de fichier Unix

QDateTime

Fonctions de date et d'heure

QDebug

Flux de sortie pour les informations de débogage

QDir

Accès aux structures de répertoire et à leur contenu

QDnsDomainNameRecord

Stocke des informations sur un enregistrement de nom de domaine

QDnsHostAddressRecord

Stocke des informations sur un enregistrement d'adresse d'hôte

QDnsMailExchangeRecord

Enregistre des informations sur un enregistrement DNS MX

QDnsServiceRecord

Enregistre des informations sur un enregistrement DNS SRV

QDnsTextRecord

Enregistre des informations sur un enregistrement DNS TXT

QDnsTlsAssociationRecord

Enregistre des informations sur un enregistrement DNS TLSA

QFileInfo

API indépendante du système d'exploitation pour récupérer des informations sur les entrées du système de fichiers

QFont

Spécifie une requête pour une police utilisée pour dessiner du texte

QFontInfo

Informations générales sur les polices

QFontMetrics

Informations sur les métriques des polices

QFontMetricsF

Informations sur les métriques des polices

QFontVariableAxis

Représente un axe variable dans une police

QFormDataBuilder

Classe de commodité pour simplifier la construction des objets QHttpMultiPart

QFormDataPartBuilder

Classe de commodité pour simplifier la construction d'objets QHttpPart

QGeoAreaMonitorInfo

Décrit les paramètres d'une zone ou d'une région à surveiller pour la proximité

QGeoPositionInfo

Contient des informations sur la position, la direction et la vitesse d'un satellite à un moment donné.

QGeoSatelliteInfo

Contient des informations de base sur un satellite

QGlyphRun

Accès direct aux glyphes internes d'une police.

QGradient

Utilisé en combinaison avec QBrush pour spécifier des remplissages en dégradé

QHash

Classe de modèle qui fournit un dictionnaire basé sur une table de hachage

QHostAddress

Adresse IP

QHttp1Configuration

Contrôle les paramètres et réglages HTTP/1

QHttp2Configuration

Contrôle les paramètres et les réglages HTTP/2

QHttpPart

Contient une partie du corps à utiliser à l'intérieur d'un message MIME multipartite HTTP

QIcon

Icônes évolutives dans différents modes et états

QImage

Représentation d'image indépendante du matériel qui permet un accès direct aux données des pixels et peut être utilisée comme dispositif de peinture

QJsonArray

Encapsule un tableau JSON

QJsonDocument

Permet de lire et d'écrire des documents JSON

QJsonObject

Encapsule un objet JSON

QJsonParseError

Utilisé pour signaler les erreurs lors de l'analyse JSON

QJsonValue

Encapsule une valeur dans JSON

QKeySequence

Encapsule une séquence de touches telle qu'utilisée par les raccourcis

QLinkedList

Classe de modèle qui fournit des listes liées

QList

Classe de modèle qui fournit un tableau dynamique

QLocale

Convertit les nombres et leur représentation sous forme de chaîne de caractères dans différents langages

QLowEnergyAdvertisingData

Représente les données à diffuser lors de la publicité Bluetooth Low Energy

QLowEnergyAdvertisingParameters

Représente les paramètres utilisés pour la publicité Bluetooth Low Energy

QLowEnergyCharacteristicData

Utilisé pour configurer les données de service GATT

QLowEnergyConnectionParameters

Utilisé pour demander ou signaler une mise à jour des paramètres d'une connexion Bluetooth LE

QLowEnergyDescriptorData

Utilisé pour créer des données de service GATT

QLowEnergyServiceData

Utilisé pour configurer les données de service GATT

QMap

Classe de modèle qui fournit un tableau associatif

QMimeType

Décrit les types de fichiers ou de données, représentés par une chaîne de type MIME

QMqttTopicFilter

Représente un filtre de sujet MQTT

QMqttTopicName

Représente un nom de sujet MQTT

QMultiHash

Table de hachage multivaluée

QMultiMap

Classe de modèle qui fournit un tableau associatif avec plusieurs clés équivalentes

QNetworkAddressEntry

Stocke une adresse IP prise en charge par une interface réseau, ainsi que le masque de réseau et l'adresse de diffusion qui lui sont associés.

QNetworkCacheMetaData

Informations de cache

QNetworkCookie

Contient un cookie réseau

QNetworkInterface

Liste des adresses IP et des interfaces réseau de l'hôte

QNetworkProxy

Proxy de la couche réseau

QNetworkProxyQuery

Utilisé pour demander les paramètres du proxy pour une socket

QNetworkRequest

Contient une requête à envoyer à QNetworkAccessManager

QNetworkRequestFactory

Classe pratique permettant de regrouper des points d'extrémité de serveurs distants qui partagent des propriétés de demande de réseau communes.

QOpenGLDebugMessage

Enveloppe un message de débogage OpenGL

QPageRanges

Représente une collection de plages de pages

QPalette

Contient des groupes de couleurs pour chaque état de widget

QPen

Définit la manière dont un QPainter doit dessiner les lignes et les contours des formes

QPersistentModelIndex

Utilisé pour localiser les données dans un modèle de données

QPicture

Dispositif de peinture qui enregistre et reproduit les commandes du QPainter

QPixmap

Représentation d'une image hors écran pouvant être utilisée comme dispositif de peinture

QPolygon

Liste de points utilisant la précision des nombres entiers

QPolygonF

Liste de points utilisant la précision de la virgule flottante

QProcessEnvironment

Contient les variables d'environnement qui peuvent être transmises à un programme

QQueue

Conteneur générique qui fournit une file d'attente

QRawFont

Accès à une instance physique unique d'une police

QRegExp

Correspondance de motifs à l'aide d'expressions régulières

QRegion

Spécifie une région de clip pour un peintre

QRegularExpression

Correspondance de motifs à l'aide d'expressions régulières

QRegularExpressionMatch

Résultats d'une correspondance entre une QRegularExpression et une chaîne de caractères

QRegularExpressionMatchIterator

Itérateur sur les résultats d'une correspondance globale d'un objet QRegularExpression avec une chaîne de caractères

QSet

Classe de modèle qui fournit un ensemble basé sur une table de hachage

QSqlField

Manipule les champs dans les tables et les vues des bases de données SQL

QSqlQuery

Moyen d'exécuter et de manipuler des instructions SQL

QSqlRecord

Encapsule un enregistrement de base de données

QSslCertificate

API pratique pour un certificat X509

QSslCertificateExtension

API permettant d'accéder aux extensions d'un certificat X509

QSslCipher

Représente un code cryptographique SSL

QSslConfiguration

Contient la configuration et l'état d'une connexion SSL

QSslDiffieHellmanParameters

Interface pour les paramètres Diffie-Hellman pour les serveurs

QSslError

Erreur SSL

QSslKey

Interface pour les clés privées et publiques

QSslPreSharedKeyAuthenticator

Données d'authentification pour les suites de chiffrement à clés pré-partagées (PSK)

QStack

Classe modèle qui fournit une pile

QStaticText

Permet d'optimiser le dessin du texte lorsque le texte et sa mise en page sont rarement mis à jour

QStorageInfo

Fournit des informations sur le stockage et les lecteurs actuellement montés

QString

Chaîne de caractères Unicode

QStringList

Liste de chaînes de caractères

QTextBlockFormat

Informations de formatage pour les blocs de texte dans un document QTextDocument

QTextBoundaryFinder

Moyen de trouver les limites d'un texte Unicode dans une chaîne de caractères

QTextCharFormat

Informations de formatage pour les caractères dans un QTextDocument

QTextCursor

Offre une API pour accéder aux QTextDocuments et les modifier

QTextDocumentFragment

Représente un morceau de texte formaté provenant d'un QTextDocument

QTextFormat

Informations de formatage pour un QTextDocument

QTextFrameFormat

Informations de formatage pour les cadres dans un QTextDocument

QTextImageFormat

Informations de formatage pour les images dans un QTextDocument

QTextListFormat

Informations de formatage pour les listes dans un document QTextDocument

QTextTableCellFormat

Informations de formatage pour les cellules de tableau dans un document QTextDocument

QTextTableFormat

Informations de formatage pour les tableaux dans un document QTextDocument

QUrl

Interface pratique pour travailler avec des URL

QUrlQuery

Manière de manipuler des paires clé-valeur dans une requête d'URL

QVariant

Agit comme une union pour les types de données Qt les plus courants

© 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.