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.

QBitArray

Array von Bits

QBitmap

Monochrome (1-Bit-Tiefe) Pixmaps

QBrush

Definiert das Füllmuster der von QPainter gezeichneten Formen

QByteArray

Array von Bytes

QByteArrayList

Liste von Byte-Arrays

QByteArrayView

Ansicht auf ein Array von Bytes mit einer schreibgeschützten Teilmenge der QByteArray API

QCache

Vorlagenklasse, die einen Cache bereitstellt

QCollator

Vergleicht Strings nach einem lokalisierten Sortieralgorithmus

QCollatorSortKey

Kann verwendet werden, um die String-Kollationierung zu beschleunigen

QCommandLineOption

Definiert eine mögliche Kommandozeilenoption

QContiguousCache

Schablonenklasse, die einen zusammenhängenden Cache bereitstellt

QCursor

Mauszeiger mit beliebiger Form

QDBusPendingCall

Verweist auf einen anstehenden asynchronen Aufruf

QDBusUnixFileDescriptor

Enthält einen Unix-Dateideskriptor

QDateTime

Funktionen für Datum und Uhrzeit

QDebug

Ausgabestrom für Debugging-Informationen

QDir

Zugriff auf Verzeichnisstrukturen und deren Inhalte

QDnsDomainNameRecord

Speichert Informationen über einen Domänennamensatz

QDnsHostAddressRecord

Speichert Informationen über einen Host-Adress-Eintrag

QDnsMailExchangeRecord

Speichert Informationen über einen DNS MX-Eintrag

QDnsServiceRecord

Speichert Informationen über einen DNS SRV-Eintrag

QDnsTextRecord

Speichert Informationen über einen DNS-TXT-Eintrag

QDnsTlsAssociationRecord

Speichert Informationen über einen DNS TLSA-Eintrag

QFileInfo

Betriebssystem-unabhängige API zum Abrufen von Informationen über Dateisystemeinträge

QFont

Spezifiziert eine Abfrage für eine Schriftart, die zum Zeichnen von Text verwendet wird

QFontInfo

Allgemeine Informationen über Schriftarten

QFontMetrics

Informationen über Schriftmetriken

QFontMetricsF

Informationen zur Schriftart-Metrik

QFormDataBuilder

Convenience-Klasse zur Vereinfachung der Konstruktion von QHttpMultiPart-Objekten

QFormDataPartBuilder

Convenience-Klasse zur Vereinfachung des Aufbaus von QHttpPart-Objekten

QGeoAreaMonitorInfo

Beschreibt die Parameter eines Bereichs oder einer Region, die auf Nähe überwacht werden soll

QGeoPositionInfo

Enthält Informationen über eine globale Position, Richtung und Geschwindigkeit zu einem bestimmten Zeitpunkt

QGeoSatelliteInfo

Enthält grundlegende Informationen über einen Satelliten

QGlyphRun

Direkter Zugriff auf die internen Glyphen in einer Schriftart

QGradient

Wird in Kombination mit QBrush verwendet, um Farbverläufe zu spezifizieren

QHash

Vorlagenklasse, die ein auf Hash-Tabellen basierendes Wörterbuch bereitstellt

QHostAddress

IP-Adresse

QHttp1Configuration

Steuert HTTP/1-Parameter und -Einstellungen

QHttp2Configuration

Steuert HTTP/2-Parameter und -Einstellungen

QHttpPart

Enthält einen Körperteil, der innerhalb einer HTTP-Multipart-MIME-Nachricht verwendet werden kann

QIcon

Skalierbare Icons in verschiedenen Modi und Zuständen

QImage

Hardware-unabhängige Bilddarstellung, die einen direkten Zugriff auf die Pixeldaten ermöglicht und als Malgerät verwendet werden kann

QJsonArray

Verkapselt ein JSON-Array

QJsonDocument

Möglichkeit zum Lesen und Schreiben von JSON-Dokumenten

QJsonObject

Verkapselt ein JSON-Objekt

QJsonParseError

Wird verwendet, um Fehler beim JSON-Parsing zu melden

QJsonValue

Verkapselt einen Wert in JSON

QKeySequence

Verkapselt eine Tastenfolge, wie sie von Shortcuts verwendet wird

QLinkedList

Vorlagenklasse, die verknüpfte Listen bereitstellt

QList

Schablonenklasse, die ein dynamisches Array bereitstellt

QLocale

Konvertiert zwischen Zahlen und ihren String-Darstellungen in verschiedenen Sprachen

QLowEnergyAdvertisingData

Stellt die Daten dar, die während der Bluetooth Low Energy Werbung gesendet werden

QLowEnergyAdvertisingParameters

Stellt die Parameter dar, die für Bluetooth Low Energy Werbung verwendet werden

QLowEnergyCharacteristicData

Wird verwendet, um GATT-Dienstdaten einzurichten

QLowEnergyConnectionParameters

Wird verwendet, wenn eine Aktualisierung der Parameter einer Bluetooth LE Verbindung angefordert oder gemeldet wird

QLowEnergyDescriptorData

Wird verwendet, um GATT-Dienstdaten zu erstellen

QLowEnergyServiceData

Wird verwendet, um GATT-Dienstdaten einzurichten

QMap

Vorlagenklasse, die ein assoziatives Array bereitstellt

QMimeType

Beschreibt Datei- oder Datentypen, dargestellt durch einen MIME-Typ-String

QMqttTopicFilter

Stellt einen MQTT Themenfilter dar

QMqttTopicName

Stellt einen MQTT-Topic-Namen dar

QMultiHash

Convenience QHash-Unterklasse, die mehrwertige Hashes bereitstellt

QMultiMap

Vorlagenklasse, die ein assoziatives Array mit mehreren gleichwertigen Schlüsseln bereitstellt

QNetworkAddressEntry

Speichert eine IP-Adresse, die von einer Netzwerkschnittstelle unterstützt wird, zusammen mit der zugehörigen Netzmaske und Broadcast-Adresse

QNetworkCacheMetaData

Cache-Informationen

QNetworkCookie

Enthält ein Netzwerk-Cookie

QNetworkInterface

Auflistung der IP-Adressen und Netzwerkschnittstellen des Hosts

QNetworkProxy

Proxy der Netzwerkschicht

QNetworkProxyQuery

Dient zur Abfrage der Proxy-Einstellungen für einen Socket

QNetworkRequest

Enthält eine Anfrage, die mit QNetworkAccessManager gesendet wird

QNetworkRequestFactory

Convenience-Klasse zur Gruppierung von Remote-Server-Endpunkten, die gemeinsame Netzwerkanforderungseigenschaften haben

QOpenGLDebugMessage

Verpackt eine OpenGL-Debug-Meldung

QPageRanges

Stellt eine Sammlung von Seitenbereichen dar

QPainterPath

Container für Maloperationen, mit denen grafische Formen konstruiert und wiederverwendet werden können

QPalette

Enthält Farbgruppen für jeden Widget-Zustand

QPen

Definiert, wie ein QPainter Linien und Umrisse von Formen zeichnen soll

QPersistentModelIndex

Wird zum Auffinden von Daten in einem Datenmodell verwendet

QPicture

Malgerät, das QPainter-Befehle aufzeichnet und wiedergibt

QPixmap

Bilddarstellung außerhalb des Bildschirms, die als Zeichengerät verwendet werden kann

QPolygon

Liste von Punkten mit Integer-Präzision

QPolygonF

Liste von Punkten mit Fließkommagenauigkeit

QProcessEnvironment

Enthält die Umgebungsvariablen, die an ein Programm übergeben werden können

QQueue

Generischer Container, der eine Warteschlange bereitstellt

QRawFont

Zugriff auf eine einzelne physische Instanz einer Schriftart

QRegExp

Mustervergleich mit regulären Ausdrücken

QRegion

Spezifiziert eine Clip-Region für einen Painter

QRegularExpression

Musterabgleich mit regulären Ausdrücken

QRegularExpressionMatch

Die Ergebnisse eines Abgleichs eines QRegularExpression gegen eine Zeichenkette

QRegularExpressionMatchIterator

Iterator für die Ergebnisse eines globalen Abgleichs eines QRegularExpression-Objekts mit einer Zeichenkette

QSet

Schablonenklasse, die ein Hash-Tabellen-basiertes Set bereitstellt

QSqlField

Manipuliert die Felder in SQL-Datenbanktabellen und -ansichten

QSqlQuery

Mittel zum Ausführen und Manipulieren von SQL-Anweisungen

QSqlRecord

Verkapselt einen Datenbankdatensatz

QSslCertificate

Bequeme API für ein X509-Zertifikat

QSslCertificateExtension

API für den Zugriff auf die Erweiterungen eines X509-Zertifikats

QSslCipher

Stellt eine kryptographische SSL-Chiffre dar

QSslConfiguration

Enthält die Konfiguration und den Status einer SSL-Verbindung

QSslDiffieHellmanParameters

Schnittstelle für Diffie-Hellman-Parameter für Server

QSslError

SSL-Fehler

QSslKey

Schnittstelle für private und öffentliche Schlüssel

QSslPreSharedKeyAuthenticator

Authentifizierungsdaten für Pre-Shared-Keys (PSK)-Chiffrierverfahren

QStack

Vorlagenklasse, die einen Stack bereitstellt

QStaticText

Ermöglicht optimiertes Zeichnen von Text, wenn der Text und sein Layout selten aktualisiert werden

QStorageInfo

Liefert Informationen über aktuell gemountete Speicher und Laufwerke

QString

Unicode-Zeichenfolge

QStringList

Liste von Zeichenketten

QTextBlockFormat

Formatierungsinformationen für Textblöcke in einem QTextDocument

QTextBoundaryFinder

Methode zum Auffinden von Unicode-Textgrenzen in einer Zeichenkette

QTextCharFormat

Formatierungsinformationen für Zeichen in einem QTextDocument

QTextCursor

Bietet eine API für den Zugriff und die Änderung von QTextDocuments

QTextDocumentFragment

Repräsentiert ein Stück formatierten Text aus einem QTextDocument

QTextFormat

Formatierungsinformationen für ein QTextDocument

QTextFrameFormat

Formatierungsinformationen für Rahmen in einem QTextDocument

QTextImageFormat

Formatierungsinformationen für Bilder in einem QTextDocument

QTextListFormat

Formatierungsinformationen für Listen in einem QTextDocument

QTextTableCellFormat

Formatierungsinformationen für Tabellenzellen in einem QTextDocument

QTextTableFormat

Formatierungsinformationen für Tabellen in einem QTextDocument

QUrl

Bequeme Schnittstelle für die Arbeit mit URLs

QUrlQuery

Möglichkeit zur Manipulation von Schlüssel-Wert-Paaren in einer URL-Abfrage

QVariant

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.