Implizite Freigabe
Viele C++-Klassen in Qt nutzen implizite Datenfreigabe, um die Ressourcennutzung zu maximieren und Kopiervorgänge zu minimieren. Implizit gemeinsam genutzte Klassen sind bei der Übergabe als Argumente sowohl sicher als auch effizient, da lediglich ein Zeiger auf die Daten weitergegeben wird und die Daten nur dann kopiert werden, wenn eine Funktion darauf schreibt, d. h. nach dem „Copy-on-Write“-Prinzip.
Übersicht
Eine gemeinsam genutzte Klasse besteht aus einem Zeiger auf einen gemeinsam genutzten Datenblock, der eine Referenzzähler und die Daten enthält.
Wenn ein gemeinsam genutztes Objekt erstellt wird, wird der Referenzzähler auf 1 gesetzt. Der Referenzzähler wird jedes Mal erhöht, wenn ein neues Objekt auf die gemeinsam genutzten Daten verweist, und verringert, wenn das Objekt den Verweis auf die gemeinsam genutzten Daten aufhebt. Die gemeinsam genutzten Daten werden gelöscht, sobald der Referenzzähler den Wert Null erreicht.
Beim Umgang mit gemeinsam genutzten Objekten gibt es zwei Möglichkeiten, ein Objekt zu kopieren. Man spricht dabei üblicherweise von tiefen und flachen Kopien. Eine tiefe Kopie bedeutet, dass ein Objekt dupliziert wird. Eine flache Kopie ist eine Referenzkopie, d. h. lediglich ein Zeiger auf einen gemeinsam genutzten Datenblock. Das Erstellen einer tiefen Kopie kann hinsichtlich Speicher und CPU-Leistung aufwendig sein. Das Erstellen einer flachen Kopie ist sehr schnell, da dabei lediglich ein Zeiger gesetzt und die Referenzanzahl erhöht wird.
Die Objektzuweisung (mit dem Operator =()) für implizit gemeinsam genutzte Objekte wird mithilfe von flachen Kopien implementiert.
Der Vorteil der gemeinsamen Nutzung besteht darin, dass ein Programm Daten nicht unnötig duplizieren muss, was zu einem geringeren Speicherverbrauch und weniger Datenkopien führt. Objekte lassen sich leicht zuweisen, als Funktionsargumente übergeben und aus Funktionen zurückgeben.
Die implizite gemeinsame Nutzung findet größtenteils im Hintergrund statt; der Programmierer muss sich selten Gedanken darüber machen. Die Container-Iteratoren von Qt verhalten sich jedoch anders als die der STL. Lesen Sie dazu den Abschnitt „Problem mit Iteratoren bei impliziter gemeinsamer Nutzung“.
In Multithread-Anwendungen findet implizites Teilen statt, wie unter „Threads und implizit geteilte Klassen“ erläutert.
Verwenden Sie bei der Implementierung eigener implizit gemeinsam genutzter Klassen die Klassen „ QSharedData “ und „ QSharedDataPointer “.
Implizite gemeinsame Nutzung im Detail
Bei der impliziten Freigabe wird das Objekt automatisch aus einem gemeinsam genutzten Block entfernt, wenn sich das Objekt ändern soll und die Referenzanzahl größer als eins ist. (Dies wird oft als „Copy-on-Write“ oder „Wert-Semantik“ bezeichnet.)
Eine implizit gemeinsam genutzte Klasse hat die Kontrolle über ihre internen Daten. In allen Member-Funktionen, die ihre Daten ändern, trennt sie die Verbindung automatisch, bevor die Daten geändert werden. Beachten Sie jedoch den Sonderfall bei Container-Iteratoren; siehe „Problem mit Iteratoren bei impliziter gemeinsamen Nutzung“.
Die Klasse „ QPen “, die implizites Sharing verwendet, trennt sich in allen Member-Funktionen, die die internen Daten ändern, von den gemeinsam genutzten Daten.
Codeausschnitt:
void QPen::setCapStyle(Qt::PenCapStyle c)
{
if (d->capStyle == c)
return;
detach();
d->capStyle = c;
}
void QPen::detach()
{
d.detach();
}Liste der Klassen
Die unten aufgeführten Klassen trennen 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 einzelne Instanzen dieser Klassen als separate Objekte behandeln. Sie verhalten sich stets wie separate Objekte, bieten jedoch den zusätzlichen Vorteil, dass Daten wann immer möglich gemeinsam genutzt werden. Aus diesem Grund können Sie Instanzen dieser Klassen als Argumente an Funktionen per Wert übergeben, ohne sich Gedanken über den Kopieraufwand machen zu müssen.
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 “ Daten, bis „ QPainter::begin()“ für „ p2 “ aufgerufen wird, da das Zeichnen einer Pixmap diese verändert.
Warnung: Seien Sie vorsichtig beim Kopieren eines implizit gemeinsam genutzten Containers (QMap, QList usw.), während Sie einen Iterator im STL-Stil verwenden. Siehe Problem mit implizit gemeinsam genutzten Iteratoren.
Bit-Array | |
Monochrome (1-Bit-Tiefe) Pixmaps | |
Definiert das Füllmuster von Formen, die mit QPainter gezeichnet werden | |
Byte-Array | |
Liste von Byte-Arrays | |
Zugriff auf ein Byte-Array mit einer schreibgeschützten Teilmenge der QByteArray-API | |
Vorlagenklasse, die einen Cache bereitstellt | |
Vergleicht Zeichenketten gemäß einem lokalisierten Sortieralgorithmus | |
Kann zur Beschleunigung der Zeichenfolgen-Sortierung verwendet werden | |
Definiert eine mögliche Befehlszeilenoption | |
Vorlagenklasse, die einen zusammenhängenden Cache bereitstellt | |
Mauszeiger mit beliebiger Form | |
Bezieht sich auf einen ausstehenden asynchronen Aufruf | |
Enthält einen Unix-Dateideskriptor | |
Datums- und Zeitfunktionen | |
Ausgabestrom für Debugging-Informationen | |
Zugriff auf Verzeichnisstrukturen und deren Inhalte | |
Speichert Informationen zu einem Domainnamen-Eintrag | |
Speichert Informationen über einen Host-Adress-Eintrag | |
Speichert Informationen zu einem DNS-MX-Eintrag | |
Speichert Informationen zu einem DNS-SRV-Eintrag | |
Speichert Informationen zu einem DNS-TXT-Eintrag | |
Speichert Informationen zu einem DNS-TLSA-Eintrag | |
Betriebssystemunabhängige API zum Abrufen von Informationen über Dateisystemeinträge | |
Legt eine Abfrage für eine Schriftart fest, die zum Zeichnen von Text verwendet wird | |
Allgemeine Informationen zu Schriftarten | |
Informationen zu Schriftartenmetriken | |
Informationen zu Schriftartmetriken | |
Stellt eine variable Achse in einer Schriftart dar | |
Hilfsklasse zur Vereinfachung der Erstellung von QHttpMultiPart-Objekten | |
Hilfsklasse zur Vereinfachung der Erstellung von QHttpPart-Objekten | |
Beschreibt die Parameter eines Bereichs oder einer Region, die auf Annäherung überwacht werden sollen | |
Enthält Informationen über die globale Position, Richtung und Geschwindigkeit zu einem bestimmten Zeitpunkt | |
Enthält grundlegende Informationen über einen Satelliten | |
Direkter Zugriff auf die internen Glyphen einer Schriftart | |
Wird in Kombination mit QBrush verwendet, um Farbverlaufsfüllungen festzulegen | |
Vorlagenklasse, die ein auf einer Hash-Tabelle basierendes Wörterbuch bereitstellt | |
IP-Adresse | |
Steuert HTTP/1-Parameter und -Einstellungen | |
Steuert HTTP/2-Parameter und -Einstellungen | |
Enthält einen Body-Teil, der in einer HTTP-Multipart-MIME-Nachricht verwendet werden soll | |
Skalierbare Symbole in verschiedenen Modi und Zuständen | |
Hardwareunabhängige Bilddarstellung, die direkten Zugriff auf die Pixeldaten ermöglicht und als Zeichenwerkzeug verwendet werden kann | |
Kapseln ein JSON-Array | |
Möglichkeit zum Lesen und Schreiben von JSON-Dokumenten | |
Kapseln eines JSON-Objekts | |
Wird verwendet, um Fehler beim Parsen von JSON zu melden | |
Kapseln einen Wert in JSON | |
Kapseln einer Schlüsselsequenz, wie sie von Tastenkombinationen verwendet wird | |
Vorlagenklasse, die verkettete Listen bereitstellt | |
Vorlagenklasse, die ein dynamisches Array bereitstellt | |
Konvertiert zwischen Zahlen und deren Zeichenfolgendarstellungen in verschiedenen Sprachen | |
Stellt die Daten dar, die während der Bluetooth Low Energy-Advertising-Phase gesendet werden sollen | |
Stellt die für Bluetooth Low Energy-Advertising verwendeten Parameter dar | |
Wird zum Einrichten von GATT-Dienstdaten verwendet | |
Wird verwendet, wenn eine Aktualisierung der Parameter einer Bluetooth-LE-Verbindung angefordert oder gemeldet wird | |
Wird zum Erstellen von GATT-Dienstdaten verwendet | |
Wird zum Einrichten von GATT-Dienstdaten verwendet | |
Vorlagenklasse, die ein assoziatives Array bereitstellt | |
Beschreibt Datei- oder Datentypen, die durch eine MIME-Typ-Zeichenkette dargestellt werden | |
Stellt einen MQTT-Themenfilter dar | |
Stellt einen MQTT-Themennamen dar | |
Mehrwertige Hash-Tabelle | |
Vorlagenklasse, die ein assoziatives Array mit mehreren gleichwertigen Schlüsseln bereitstellt | |
Speichert eine von einer Netzwerkschnittstelle unterstützte IP-Adresse 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 auf Netzwerkebene | |
Wird verwendet, um die Proxy-Einstellungen für einen Socket abzufragen | |
Enthält eine Anfrage, die mit dem QNetworkAccessManager gesendet werden soll | |
Hilfsklasse zum Gruppieren von Endpunkten auf Remote-Servern, die gemeinsame Eigenschaften bei Netzwerkanfragen aufweisen | |
Umschließt eine OpenGL-Debug-Meldung | |
Stellt eine Sammlung von Seitenbereichen dar | |
Enthält Farbgruppen für jeden Widget-Zustand | |
Definiert, wie ein QPainter Linien und Umrisse von Formen zeichnen soll | |
Wird verwendet, um Daten in einem Datenmodell zu lokalisieren | |
Zeichengerät, das QPainter-Befehle aufzeichnet und wiedergibt | |
Bilddarstellung außerhalb des Bildschirms, die als Zeichenvorrichtung verwendet werden kann | |
Liste von Punkten mit ganzzahliger Genauigkeit | |
Liste von Punkten mit Gleitkommagenauigkeit | |
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 | |
Musterabgleich mithilfe regulärer Ausdrücke | |
Legt einen Ausschnittbereich für einen Malwerkzeug fest | |
Musterabgleich mithilfe regulärer Ausdrücke | |
Die Ergebnisse eines Abgleichs eines QRegularExpression mit einer Zeichenkette | |
Iterator über die Ergebnisse eines globalen Abgleichs eines QRegularExpression-Objekts mit einer Zeichenkette | |
Vorlagenklasse, die eine auf einer Hash-Tabelle basierende Menge bereitstellt | |
Enthält mehrere Versionen eines Shaders, die in verschiedene Shading-Sprachen übersetzt wurden, zusammen mit Reflection-Metadaten | |
Bearbeitet die Felder in SQL-Datenbanktabellen und -Ansichten | |
Mittel zur Ausführung und Bearbeitung von SQL-Anweisungen | |
Kapseln einen Datenbankdatensatz | |
Praktische API für ein X509-Zertifikat | |
API für den Zugriff auf die Erweiterungen eines X509-Zertifikats | |
Stellt eine SSL-Verschlüsselungsmethode 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 Verschlüsselungssuiten mit vorab geteilten Schlüsseln (PSK) | |
Vorlagenklasse, die einen Stack bereitstellt | |
Ermöglicht eine optimierte Darstellung von Text, wenn der Text und sein Layout nur selten aktualisiert werden | |
Stellt Informationen zu aktuell eingebundenen Speichermedien und Laufwerken bereit | |
Unicode-Zeichenkette | |
Liste von Zeichenfolgen | |
Formatierungsinformationen für Textblöcke in einem QTextDocument | |
Methode zum Ermitteln von Unicode-Textgrenzen in einer Zeichenkette | |
Formatierungsinformationen für Zeichen in einem QTextDocument | |
Bietet eine API zum Zugriff auf und zur Bearbeitung von QTextDocuments | |
Stellt einen Teil eines formatierten Textes aus einem QTextDocument dar | |
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 | |
Praktische Schnittstelle für die Arbeit mit URLs | |
Möglichkeit zur Bearbeitung von Schlüssel-Wert-Paaren in der Abfrage einer URL | |
Fungiert als Vereinigung der gängigsten Qt-Datentypen |
© 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.