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.
Tableau de bits | |
Pixmaps monochromes (profondeur de 1 bit) | |
Définit le motif de remplissage des formes dessinées par QPainter. | |
Tableau d'octets | |
Liste de tableaux d'octets | |
Vue sur un tableau d'octets avec un sous-ensemble en lecture seule de l'API QByteArray | |
Classe modèle qui fournit un cache | |
Compare les chaînes de caractères selon un algorithme de collationnement localisé | |
Peut être utilisée pour accélérer la collation des chaînes de caractères | |
Définit une option de ligne de commande possible | |
Classe de modèle qui fournit un cache contigu | |
Curseur de souris de forme arbitraire | |
Fait référence à un appel asynchrone en attente | |
Contient un descripteur de fichier Unix | |
Fonctions de date et d'heure | |
Flux de sortie pour les informations de débogage | |
Accès aux structures de répertoire et à leur contenu | |
Stocke des informations sur un enregistrement de nom de domaine | |
Stocke des informations sur un enregistrement d'adresse d'hôte | |
Enregistre des informations sur un enregistrement DNS MX | |
Enregistre des informations sur un enregistrement DNS SRV | |
Enregistre des informations sur un enregistrement DNS TXT | |
Enregistre des informations sur un enregistrement DNS TLSA | |
API indépendante du système d'exploitation pour récupérer des informations sur les entrées du système de fichiers | |
Spécifie une requête pour une police utilisée pour dessiner du texte | |
Informations générales sur les polices | |
Informations sur les métriques des polices | |
Informations sur les métriques des polices | |
Représente un axe variable dans une police | |
Classe de commodité pour simplifier la construction des objets QHttpMultiPart | |
Classe de commodité pour simplifier la construction d'objets QHttpPart | |
Décrit les paramètres d'une zone ou d'une région à surveiller pour la proximité | |
Contient des informations sur la position, la direction et la vitesse d'un satellite à un moment donné. | |
Contient des informations de base sur un satellite | |
Accès direct aux glyphes internes d'une police. | |
Utilisé en combinaison avec QBrush pour spécifier des remplissages en dégradé | |
Classe de modèle qui fournit un dictionnaire basé sur une table de hachage | |
Adresse IP | |
Contrôle les paramètres et réglages HTTP/1 | |
Contrôle les paramètres et les réglages HTTP/2 | |
Contient une partie du corps à utiliser à l'intérieur d'un message MIME multipartite HTTP | |
Icônes évolutives dans différents modes et états | |
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 | |
Encapsule un tableau JSON | |
Permet de lire et d'écrire des documents JSON | |
Encapsule un objet JSON | |
Utilisé pour signaler les erreurs lors de l'analyse JSON | |
Encapsule une valeur dans JSON | |
Encapsule une séquence de touches telle qu'utilisée par les raccourcis | |
Classe de modèle qui fournit des listes liées | |
Classe de modèle qui fournit un tableau dynamique | |
Convertit les nombres et leur représentation sous forme de chaîne de caractères dans différents langages | |
Représente les données à diffuser lors de la publicité Bluetooth Low Energy | |
Représente les paramètres utilisés pour la publicité Bluetooth Low Energy | |
Utilisé pour configurer les données de service GATT | |
Utilisé pour demander ou signaler une mise à jour des paramètres d'une connexion Bluetooth LE | |
Utilisé pour créer des données de service GATT | |
Utilisé pour configurer les données de service GATT | |
Classe de modèle qui fournit un tableau associatif | |
Décrit les types de fichiers ou de données, représentés par une chaîne de type MIME | |
Représente un filtre de sujet MQTT | |
Représente un nom de sujet MQTT | |
Table de hachage multivaluée | |
Classe de modèle qui fournit un tableau associatif avec plusieurs clés équivalentes | |
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. | |
Informations de cache | |
Contient un cookie réseau | |
Liste des adresses IP et des interfaces réseau de l'hôte | |
Proxy de la couche réseau | |
Utilisé pour demander les paramètres du proxy pour une socket | |
Contient une requête à envoyer à QNetworkAccessManager | |
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. | |
Enveloppe un message de débogage OpenGL | |
Représente une collection de plages de pages | |
Contient des groupes de couleurs pour chaque état de widget | |
Définit la manière dont un QPainter doit dessiner les lignes et les contours des formes | |
Utilisé pour localiser les données dans un modèle de données | |
Dispositif de peinture qui enregistre et reproduit les commandes du QPainter | |
Représentation d'une image hors écran pouvant être utilisée comme dispositif de peinture | |
Liste de points utilisant la précision des nombres entiers | |
Liste de points utilisant la précision de la virgule flottante | |
Contient les variables d'environnement qui peuvent être transmises à un programme | |
Conteneur générique qui fournit une file d'attente | |
Accès à une instance physique unique d'une police | |
Correspondance de motifs à l'aide d'expressions régulières | |
Spécifie une région de clip pour un peintre | |
Correspondance de motifs à l'aide d'expressions régulières | |
Résultats d'une correspondance entre une QRegularExpression et une chaîne de caractères | |
Itérateur sur les résultats d'une correspondance globale d'un objet QRegularExpression avec une chaîne de caractères | |
Classe de modèle qui fournit un ensemble basé sur une table de hachage | |
Manipule les champs dans les tables et les vues des bases de données SQL | |
Moyen d'exécuter et de manipuler des instructions SQL | |
Encapsule un enregistrement de base de données | |
API pratique pour un certificat X509 | |
API permettant d'accéder aux extensions d'un certificat X509 | |
Représente un code cryptographique SSL | |
Contient la configuration et l'état d'une connexion SSL | |
Interface pour les paramètres Diffie-Hellman pour les serveurs | |
Erreur SSL | |
Interface pour les clés privées et publiques | |
Données d'authentification pour les suites de chiffrement à clés pré-partagées (PSK) | |
Classe modèle qui fournit une pile | |
Permet d'optimiser le dessin du texte lorsque le texte et sa mise en page sont rarement mis à jour | |
Fournit des informations sur le stockage et les lecteurs actuellement montés | |
Chaîne de caractères Unicode | |
Liste de chaînes de caractères | |
Informations de formatage pour les blocs de texte dans un document QTextDocument | |
Moyen de trouver les limites d'un texte Unicode dans une chaîne de caractères | |
Informations de formatage pour les caractères dans un QTextDocument | |
Offre une API pour accéder aux QTextDocuments et les modifier | |
Représente un morceau de texte formaté provenant d'un QTextDocument | |
Informations de formatage pour un QTextDocument | |
Informations de formatage pour les cadres dans un QTextDocument | |
Informations de formatage pour les images dans un QTextDocument | |
Informations de formatage pour les listes dans un document QTextDocument | |
Informations de formatage pour les cellules de tableau dans un document QTextDocument | |
Informations de formatage pour les tableaux dans un document QTextDocument | |
Interface pratique pour travailler avec des URL | |
Manière de manipuler des paires clé-valeur dans une requête d'URL | |
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.