Partage implicite
De nombreuses classes C++ de Qt utilisent le partage implicite des données afin d’optimiser l’utilisation des ressources et de réduire au minimum les copies. Les classes partagées implicitement sont à la fois sûres et efficaces lorsqu’elles sont transmises en tant qu’arguments, car seul un pointeur vers les données est transmis, et les données ne sont copiées que si et quand une fonction y écrit, c’est-à-dire selon le principe « copy-on-write » (copie à l’écriture).
Présentation générale
Une classe partagée se compose d’un pointeur vers un bloc de données partagé qui contient un compteur de références et les données.
Lorsqu'un objet partagé est créé, il définit le compteur de références à 1. Le compteur de références est incrémenté chaque fois qu'un nouvel objet référence les données partagées, et décrémenté lorsque l'objet désréférence les données partagées. Les données partagées sont supprimées lorsque le compteur de références atteint zéro.
Lorsqu’on utilise des 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 par référence, c’est-à-dire simplement un pointeur vers un bloc de données partagé. Effectuer une copie profonde peut être coûteux en termes de mémoire et de CPU. Effectuer une copie superficielle est très rapide, car cela implique uniquement de définir un pointeur et d’incrémenter le compteur de références.
L'affectation d'objets (avec l'opérateur =()) pour les objets implicitement partagés est implémentée à l'aide de copies superficielles.
L’avantage du partage est qu’un programme n’a pas besoin de dupliquer inutilement les données, ce qui se traduit par une utilisation réduite de la mémoire et moins de copies de données. Les objets peuvent facilement être assignés, transmis en tant qu’arguments de fonction et renvoyés par des fonctions.
Le partage implicite s'effectue principalement en arrière-plan ; le programmeur n'a que rarement à s'en soucier. Cependant, les itérateurs de conteneurs de Qt ont un comportement différent de ceux de la STL. Lire « Problème d'itérateur lié au partage implicite ».
Dans les applications multithread, le partage implicite intervient, comme expliqué dans la section « Threads et classes partagées implicitement ».
Lorsque vous implémentez vos propres classes à partage implicite, 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 celui-ci est sur le point d’être modifié et si le nombre de références est supérieur à un. (Ce mécanisme est souvent appelé « copie à l’écriture » ou « sémantique de valeur ».)
Une classe partagée implicitement contrôle ses données internes. Dans toute fonction membre qui modifie 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 « Problème d'itérateur en 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.
Extrait 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 répertoriées ci-dessous se dissocient automatiquement des données communes lorsqu’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 leurs instances distinctes comme des objets distincts. Elles se comporteront toujours comme des objets distincts, tout en bénéficiant de l'avantage supplémentaire de partager des données chaque fois que cela est possible. C'est pourquoi vous pouvez passer des instances de ces classes en tant qu'arguments de fonctions par valeur sans vous soucier de la surcharge liée à la 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, car le dessin d’une image pixmap la modifie.
Avertissement : soyez prudent lorsque vous copiez un conteneur partagé implicitement (QMap, QList, etc.) tout en utilisant un itérateur de type STL. Voir Problème lié aux itérateurs à partage implicite.
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 de modèle fournissant un cache | |
Compare des chaînes de caractères selon un algorithme de classement localisé | |
Peut être utilisé pour accélérer le classement des chaînes de caractères | |
Définit une option de ligne de commande possible | |
Classe modèle fournissant 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épertoires et à leur contenu | |
Stocke des informations sur un enregistrement de nom de domaine | |
Stocke des informations sur un enregistrement d'adresse d'hôte | |
Stocke des informations sur un enregistrement MX DNS | |
Stocke des informations sur un enregistrement SRV DNS | |
Stocke des informations sur un enregistrement DNS de type TXT | |
Stocke des informations sur un enregistrement DNS TLSA | |
API indépendante du système d'exploitation permettant de récupérer des informations sur les entrées du système de fichiers | |
Spécifie une requête concernant une police utilisée pour l'affichage 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 utilitaire permettant de simplifier la construction d'objets QHttpMultiPart | |
Classe utilitaire permettant de simplifier la création d'objets QHttpPart | |
Décrit les paramètres d'une zone ou d'une région à surveiller pour détecter toute proximité | |
Contient des informations recueillies sur la position, la direction et la vitesse globales à 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 dégradés | |
Classe de modèle fournissant un dictionnaire basé sur une table de hachage | |
Adresse IP | |
Contrôle les paramètres et les réglages HTTP/1 | |
Gère les paramètres et les réglages HTTP/2 | |
Contient une partie du corps à utiliser dans un message MIME HTTP multipart | |
Icônes redimensionnables selon différents modes et états | |
Représentation d’image indépendante du matériel permettant un accès direct aux données de pixels et pouvant être utilisée comme périphérique de dessin | |
Encapsule un tableau JSON | |
Moyen de lire et d'écrire des documents JSON | |
Encapsule un objet JSON | |
Utilisé pour signaler les erreurs lors de l'analyse syntaxique JSON | |
Encapsule une valeur en JSON | |
Encapsule une séquence de touches telle qu'utilisée par les raccourcis clavier | |
Classe de modèle fournissant des listes chaînées | |
Classe de modèle fournissant un tableau dynamique | |
Effectue la conversion entre les nombres et leurs représentations sous forme de chaînes de caractères dans différentes langues | |
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ée pour configurer les données de service GATT | |
Utilisée lors de la demande ou de la notification d’une mise à jour des paramètres d’une connexion Bluetooth LE | |
Utilisé pour créer les données de service GATT | |
Utilisé pour configurer les données de service GATT | |
Classe de modèle fournissant 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 à valeurs multiples | |
Classe de modèle fournissant un tableau associatif comportant plusieurs clés équivalentes | |
Stocke une adresse IP prise en charge par une interface réseau, ainsi que son masque de réseau et son adresse de diffusion 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 couche réseau | |
Utilisé pour interroger les paramètres de proxy d’un socket | |
Contient une requête à envoyer avec QNetworkAccessManager | |
Classe utilitaire permettant de regrouper des points de terminaison de serveurs distants partageant des propriétés communes en matière de requêtes réseau | |
Enveloppe un message de débogage OpenGL | |
Représente un ensemble 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 des données dans un modèle de données | |
Périphérique de dessin qui enregistre et rejoue les commandes QPainter | |
Représentation d'image hors écran pouvant servir de périphérique de dessin | |
Liste de points avec une précision en nombres entiers | |
Liste de points avec une précision en virgule flottante | |
Contient les variables d'environnement pouvant être transmises à un programme | |
Conteneur générique fournissant 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 zone de découpe pour un outil de dessin | |
Correspondance de motifs à l'aide d'expressions régulières | |
Résultats de la correspondance entre un objet 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 fournissant un ensemble basé sur une table de hachage | |
Contient plusieurs versions d’un shader traduites dans plusieurs langages de shading, ainsi que des métadonnées de réflexion | |
Permet de manipuler les champs des tables et des vues d'une base 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 algorithme de chiffrement SSL | |
Contient la configuration et l'état d'une connexion SSL | |
Interface pour les paramètres Diffie-Hellman destinés aux 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 fournissant une pile | |
Permet un affichage optimisé du texte lorsque celui-ci et sa mise en page sont rarement mis à jour | |
Fournit des informations sur les périphériques de stockage et les lecteurs actuellement montés | |
Chaîne de caractères Unicode | |
Liste de chaînes de caractères | |
Informations de mise en forme pour des blocs de texte dans un QTextDocument | |
Méthode pour déterminer les limites du texte Unicode dans une chaîne | |
Informations de mise en forme pour les caractères dans un QTextDocument | |
Fournit une API permettant d'accéder aux QTextDocuments et de les modifier | |
Représente un fragment de texte formaté issu d'un QTextDocument | |
Informations de mise en forme pour un QTextDocument | |
Informations de mise en forme des cadres dans un QTextDocument | |
Informations de mise en forme pour les images d'un QTextDocument | |
Informations de mise en forme pour les listes d'un QTextDocument | |
Informations de mise en forme pour les cellules de tableau dans un QTextDocument | |
Informations de mise en forme pour les tableaux dans un QTextDocument | |
Interface pratique pour travailler avec les URL | |
Méthode pour manipuler des paires clé-valeur dans la partie « query » d'une URL | |
Fonctionne 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.