Implizite Freigabe
Viele C++-Klassen in Qt verwenden implizite gemeinsame Datennutzung, um die Ressourcennutzung zu maximieren und das Kopieren zu minimieren. Implizit gemeinsam genutzte Klassen sind sowohl sicher als auch effizient, wenn sie als Argumente übergeben werden, da nur ein Zeiger auf die Daten weitergegeben wird und die Daten nur dann kopiert werden, wenn eine Funktion darauf schreibt, d.h. copy-on-write.
Überblick
Eine gemeinsam genutzte Klasse besteht aus einem Zeiger auf einen gemeinsam genutzten Datenblock, der eine Referenzzahl und die Daten enthält.
Wenn ein gemeinsames Objekt erstellt wird, setzt es den Referenzzähler auf 1. Der Referenzzähler wird erhöht, wenn ein neues Objekt auf die gemeinsamen Daten verweist, und verringert, wenn das Objekt die gemeinsamen Daten dereferenziert. Die gemeinsam genutzten Daten werden gelöscht, wenn der Referenzzähler Null wird.
Beim Umgang mit gemeinsam genutzten Objekten gibt es zwei Möglichkeiten, ein Objekt zu kopieren. Man spricht gewöhnlich von tiefen und flachen Kopien. Eine tiefe Kopie bedeutet, dass ein Objekt dupliziert wird. Eine flache Kopie ist eine Referenzkopie, d.h. nur ein Zeiger auf einen gemeinsamen Datenblock. Die Erstellung einer tiefen Kopie kann teuer sein, was den Speicher und die CPU betrifft. Eine oberflächliche Kopie ist sehr schnell, da sie nur das Setzen eines Zeigers und das Erhöhen der Referenzzahl beinhaltet.
Die Zuweisung von Objekten (mit operator=()) für implizit gemeinsam genutzte Objekte wird mit flachen Kopien durchgeführt.
Der Vorteil der gemeinsamen Nutzung besteht darin, dass ein Programm Daten nicht unnötig duplizieren muss, was zu einem geringeren Speicherverbrauch und weniger Kopieren von Daten führt. Objekte können leicht zugewiesen, als Funktionsargumente gesendet und von Funktionen zurückgegeben werden.
Implizites Sharing findet meist hinter den Kulissen statt; der Programmierer muss sich selten darum kümmern. Allerdings verhalten sich die Container-Iteratoren von Qt anders als die der STL. Lesen Sie Implizites Sharing Iterator Problem.
In Multithread-Anwendungen findet eine implizite gemeinsame Nutzung statt, wie in Threads und implizit gemeinsam genutzte Klassen erläutert.
Wenn Sie Ihre eigenen implizit gemeinsam genutzten Klassen implementieren, verwenden Sie die Klassen QSharedData und QSharedDataPointer.
Implizite gemeinsame Nutzung im Detail
Bei der impliziten gemeinsamen Nutzung wird das Objekt automatisch von einem gemeinsam genutzten Block getrennt, wenn sich das Objekt gerade ändert und die Anzahl der Referenzen größer als eins ist. (Dies wird oft als Copy-on-Write oder Value Semantics bezeichnet.)
Eine implizit gemeinsam genutzte Klasse hat die Kontrolle über ihre internen Daten. In allen Mitgliedsfunktionen, die ihre Daten ändern, löst sie sich automatisch, bevor sie die Daten ändert. Beachten Sie jedoch den Sonderfall mit Container-Iteratoren; siehe Implizites Sharing-Iterator-Problem.
Die Klasse QPen, die implizites Sharing verwendet, löst sich von den gemeinsam genutzten Daten in allen Mitgliedsfunktionen, die die internen Daten ändern.
Code-Fragment:
void QPen::setStyle(Qt::PenStyle style) { detach(); // detach from common data d->style = style; // set the style member } void QPen::detach() { if (d->ref != 1) { ... // perform a deep copy } }
Liste der Klassen
Die unten aufgeführten Klassen lösen sich automatisch von gemeinsamen Daten, wenn ein Objekt geändert werden soll. Der Programmierer wird nicht einmal bemerken, dass die Objekte gemeinsam genutzt werden. Daher sollten Sie separate Instanzen dieser Klassen als separate Objekte behandeln. Sie werden sich immer wie separate Objekte verhalten, aber mit dem zusätzlichen Vorteil, dass sie, wann immer möglich, Daten gemeinsam nutzen. Aus diesem Grund können Sie Instanzen dieser Klassen als Argumente an Funktionen nach Wert übergeben, ohne sich um den Kopieraufwand zu kümmern.
Beispiel:
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();
In diesem Beispiel teilen sich p1
und p2
die Daten, bis QPainter::begin() für p2
aufgerufen wird, da das Malen einer Pixmap diese verändert.
Warnung: Seien Sie vorsichtig beim Kopieren eines implizit gemeinsam genutzten Containers (QMap, QList, etc.), während Sie STL-artige Iteratoren verwenden. Siehe Problem der impliziten gemeinsamen Nutzung von Iteratoren.
Array von Bits | |
Monochrome (1-Bit-Tiefe) Pixmaps | |
Definiert das Füllmuster der von QPainter gezeichneten Formen | |
Array von Bytes | |
Liste von Byte-Arrays | |
Ansicht auf ein Array von Bytes mit einer schreibgeschützten Teilmenge der QByteArray API | |
Vorlagenklasse, die einen Cache bereitstellt | |
Vergleicht Strings nach einem lokalisierten Sortieralgorithmus | |
Kann verwendet werden, um die String-Kollationierung zu beschleunigen | |
Definiert eine mögliche Kommandozeilenoption | |
Schablonenklasse, die einen zusammenhängenden Cache bereitstellt | |
Mauszeiger mit beliebiger Form | |
Verweist auf einen anstehenden asynchronen Aufruf | |
Enthält einen Unix-Dateideskriptor | |
Funktionen für Datum und Uhrzeit | |
Ausgabestrom für Debugging-Informationen | |
Zugriff auf Verzeichnisstrukturen und deren Inhalte | |
Speichert Informationen über einen Domänennamensatz | |
Speichert Informationen über einen Host-Adress-Eintrag | |
Speichert Informationen über einen DNS MX-Eintrag | |
Speichert Informationen über einen DNS SRV-Eintrag | |
Speichert Informationen über einen DNS-TXT-Eintrag | |
Speichert Informationen über einen DNS TLSA-Eintrag | |
Betriebssystem-unabhängige API zum Abrufen von Informationen über Dateisystemeinträge | |
Spezifiziert eine Abfrage für eine Schriftart, die zum Zeichnen von Text verwendet wird | |
Allgemeine Informationen über Schriftarten | |
Informationen über Schriftmetriken | |
Informationen zur Schriftart-Metrik | |
Convenience-Klasse zur Vereinfachung der Konstruktion von QHttpMultiPart-Objekten | |
Convenience-Klasse zur Vereinfachung des Aufbaus von QHttpPart-Objekten | |
Beschreibt die Parameter eines Bereichs oder einer Region, die auf Nähe überwacht werden soll | |
Enthält Informationen über eine globale Position, Richtung und Geschwindigkeit zu einem bestimmten Zeitpunkt | |
Enthält grundlegende Informationen über einen Satelliten | |
Direkter Zugriff auf die internen Glyphen in einer Schriftart | |
Wird in Kombination mit QBrush verwendet, um Farbverläufe zu spezifizieren | |
Vorlagenklasse, die ein auf Hash-Tabellen basierendes Wörterbuch bereitstellt | |
IP-Adresse | |
Steuert HTTP/1-Parameter und -Einstellungen | |
Steuert HTTP/2-Parameter und -Einstellungen | |
Enthält einen Körperteil, der innerhalb einer HTTP-Multipart-MIME-Nachricht verwendet werden kann | |
Skalierbare Icons in verschiedenen Modi und Zuständen | |
Hardware-unabhängige Bilddarstellung, die einen direkten Zugriff auf die Pixeldaten ermöglicht und als Malgerät verwendet werden kann | |
Verkapselt ein JSON-Array | |
Möglichkeit zum Lesen und Schreiben von JSON-Dokumenten | |
Verkapselt ein JSON-Objekt | |
Wird verwendet, um Fehler beim JSON-Parsing zu melden | |
Verkapselt einen Wert in JSON | |
Verkapselt eine Tastenfolge, wie sie von Shortcuts verwendet wird | |
Vorlagenklasse, die verknüpfte Listen bereitstellt | |
Schablonenklasse, die ein dynamisches Array bereitstellt | |
Konvertiert zwischen Zahlen und ihren String-Darstellungen in verschiedenen Sprachen | |
Stellt die Daten dar, die während der Bluetooth Low Energy Werbung gesendet werden | |
Stellt die Parameter dar, die für Bluetooth Low Energy Werbung verwendet werden | |
Wird verwendet, um GATT-Dienstdaten einzurichten | |
Wird verwendet, wenn eine Aktualisierung der Parameter einer Bluetooth LE Verbindung angefordert oder gemeldet wird | |
Wird verwendet, um GATT-Dienstdaten zu erstellen | |
Wird verwendet, um GATT-Dienstdaten einzurichten | |
Vorlagenklasse, die ein assoziatives Array bereitstellt | |
Beschreibt Datei- oder Datentypen, dargestellt durch einen MIME-Typ-String | |
Stellt einen MQTT Themenfilter dar | |
Stellt einen MQTT-Topic-Namen dar | |
Convenience QHash-Unterklasse, die mehrwertige Hashes bereitstellt | |
Vorlagenklasse, die ein assoziatives Array mit mehreren gleichwertigen Schlüsseln bereitstellt | |
Speichert eine IP-Adresse, die von einer Netzwerkschnittstelle unterstützt wird, zusammen mit der zugehörigen Netzmaske und Broadcast-Adresse | |
Cache-Informationen | |
Enthält ein Netzwerk-Cookie | |
Auflistung der IP-Adressen und Netzwerkschnittstellen des Hosts | |
Proxy der Netzwerkschicht | |
Dient zur Abfrage der Proxy-Einstellungen für einen Socket | |
Enthält eine Anfrage, die mit QNetworkAccessManager gesendet wird | |
Convenience-Klasse zur Gruppierung von Remote-Server-Endpunkten, die gemeinsame Netzwerkanforderungseigenschaften haben | |
Verpackt eine OpenGL-Debug-Meldung | |
Stellt eine Sammlung von Seitenbereichen dar | |
Container für Maloperationen, mit denen grafische Formen konstruiert und wiederverwendet werden können | |
Enthält Farbgruppen für jeden Widget-Zustand | |
Definiert, wie ein QPainter Linien und Umrisse von Formen zeichnen soll | |
Wird zum Auffinden von Daten in einem Datenmodell verwendet | |
Malgerät, das QPainter-Befehle aufzeichnet und wiedergibt | |
Bilddarstellung außerhalb des Bildschirms, die als Zeichengerät verwendet werden kann | |
Liste von Punkten mit Integer-Präzision | |
Liste von Punkten mit Fließkommagenauigkeit | |
Enthält die Umgebungsvariablen, die an ein Programm übergeben werden können | |
Generischer Container, der eine Warteschlange bereitstellt | |
Zugriff auf eine einzelne physische Instanz einer Schriftart | |
Mustervergleich mit regulären Ausdrücken | |
Spezifiziert eine Clip-Region für einen Painter | |
Musterabgleich mit regulären Ausdrücken | |
Die Ergebnisse eines Abgleichs eines QRegularExpression gegen eine Zeichenkette | |
Iterator für die Ergebnisse eines globalen Abgleichs eines QRegularExpression-Objekts mit einer Zeichenkette | |
Schablonenklasse, die ein Hash-Tabellen-basiertes Set bereitstellt | |
Manipuliert die Felder in SQL-Datenbanktabellen und -ansichten | |
Mittel zum Ausführen und Manipulieren von SQL-Anweisungen | |
Verkapselt einen Datenbankdatensatz | |
Bequeme API für ein X509-Zertifikat | |
API für den Zugriff auf die Erweiterungen eines X509-Zertifikats | |
Stellt eine kryptographische SSL-Chiffre dar | |
Enthält die Konfiguration und den Status einer SSL-Verbindung | |
Schnittstelle für Diffie-Hellman-Parameter für Server | |
SSL-Fehler | |
Schnittstelle für private und öffentliche Schlüssel | |
Authentifizierungsdaten für Pre-Shared-Keys (PSK)-Chiffrierverfahren | |
Vorlagenklasse, die einen Stack bereitstellt | |
Ermöglicht optimiertes Zeichnen von Text, wenn der Text und sein Layout selten aktualisiert werden | |
Liefert Informationen über aktuell gemountete Speicher und Laufwerke | |
Unicode-Zeichenfolge | |
Liste von Zeichenketten | |
Formatierungsinformationen für Textblöcke in einem QTextDocument | |
Methode zum Auffinden von Unicode-Textgrenzen in einer Zeichenkette | |
Formatierungsinformationen für Zeichen in einem QTextDocument | |
Bietet eine API für den Zugriff und die Änderung von QTextDocuments | |
Repräsentiert ein Stück formatierten Text aus einem QTextDocument | |
Formatierungsinformationen für ein QTextDocument | |
Formatierungsinformationen für Rahmen in einem QTextDocument | |
Formatierungsinformationen für Bilder in einem QTextDocument | |
Formatierungsinformationen für Listen in einem QTextDocument | |
Formatierungsinformationen für Tabellenzellen in einem QTextDocument | |
Formatierungsinformationen für Tabellen in einem QTextDocument | |
Bequeme Schnittstelle für die Arbeit mit URLs | |
Möglichkeit zur Manipulation von Schlüssel-Wert-Paaren in einer URL-Abfrage | |
Verhält sich wie eine Union für die gängigsten Qt-Datentypen |
© 2025 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.