Auf dieser Seite

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.

QBitArray

Bit-Array

QBitmap

Monochrome (1-Bit-Tiefe) Pixmaps

QBrush

Definiert das Füllmuster von Formen, die mit QPainter gezeichnet werden

QByteArray

Byte-Array

QByteArrayList

Liste von Byte-Arrays

QByteArrayView

Zugriff auf ein Byte-Array mit einer schreibgeschützten Teilmenge der QByteArray-API

QCache

Vorlagenklasse, die einen Cache bereitstellt

QCollator

Vergleicht Zeichenketten gemäß einem lokalisierten Sortieralgorithmus

QCollatorSortKey

Kann zur Beschleunigung der Zeichenfolgen-Sortierung verwendet werden

QCommandLineOption

Definiert eine mögliche Befehlszeilenoption

QContiguousCache

Vorlagenklasse, die einen zusammenhängenden Cache bereitstellt

QCursor

Mauszeiger mit beliebiger Form

QDBusPendingCall

Bezieht sich auf einen ausstehenden asynchronen Aufruf

QDBusUnixFileDescriptor

Enthält einen Unix-Dateideskriptor

QDateTime

Datums- und Zeitfunktionen

QDebug

Ausgabestrom für Debugging-Informationen

QDir

Zugriff auf Verzeichnisstrukturen und deren Inhalte

QDnsDomainNameRecord

Speichert Informationen zu einem Domainnamen-Eintrag

QDnsHostAddressRecord

Speichert Informationen über einen Host-Adress-Eintrag

QDnsMailExchangeRecord

Speichert Informationen zu einem DNS-MX-Eintrag

QDnsServiceRecord

Speichert Informationen zu einem DNS-SRV-Eintrag

QDnsTextRecord

Speichert Informationen zu einem DNS-TXT-Eintrag

QDnsTlsAssociationRecord

Speichert Informationen zu einem DNS-TLSA-Eintrag

QFileInfo

Betriebssystemunabhängige API zum Abrufen von Informationen über Dateisystemeinträge

QFont

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

QFontInfo

Allgemeine Informationen zu Schriftarten

QFontMetrics

Informationen zu Schriftartenmetriken

QFontMetricsF

Informationen zu Schriftartmetriken

QFontVariableAxis

Stellt eine variable Achse in einer Schriftart dar

QFormDataBuilder

Hilfsklasse zur Vereinfachung der Erstellung von QHttpMultiPart-Objekten

QFormDataPartBuilder

Hilfsklasse zur Vereinfachung der Erstellung von QHttpPart-Objekten

QGeoAreaMonitorInfo

Beschreibt die Parameter eines Bereichs oder einer Region, die auf Annäherung überwacht werden sollen

QGeoPositionInfo

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

QGeoSatelliteInfo

Enthält grundlegende Informationen über einen Satelliten

QGlyphRun

Direkter Zugriff auf die internen Glyphen einer Schriftart

QGradient

Wird in Kombination mit QBrush verwendet, um Farbverlaufsfüllungen festzulegen

QHash

Vorlagenklasse, die ein auf einer Hash-Tabelle 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 Body-Teil, der in einer HTTP-Multipart-MIME-Nachricht verwendet werden soll

QIcon

Skalierbare Symbole in verschiedenen Modi und Zuständen

QImage

Hardwareunabhängige Bilddarstellung, die direkten Zugriff auf die Pixeldaten ermöglicht und als Zeichenwerkzeug verwendet werden kann

QJsonArray

Kapseln ein JSON-Array

QJsonDocument

Möglichkeit zum Lesen und Schreiben von JSON-Dokumenten

QJsonObject

Kapseln eines JSON-Objekts

QJsonParseError

Wird verwendet, um Fehler beim Parsen von JSON zu melden

QJsonValue

Kapseln einen Wert in JSON

QKeySequence

Kapseln einer Schlüsselsequenz, wie sie von Tastenkombinationen verwendet wird

QLinkedList

Vorlagenklasse, die verkettete Listen bereitstellt

QList

Vorlagenklasse, die ein dynamisches Array bereitstellt

QLocale

Konvertiert zwischen Zahlen und deren Zeichenfolgendarstellungen in verschiedenen Sprachen

QLowEnergyAdvertisingData

Stellt die Daten dar, die während der Bluetooth Low Energy-Advertising-Phase gesendet werden sollen

QLowEnergyAdvertisingParameters

Stellt die für Bluetooth Low Energy-Advertising verwendeten Parameter dar

QLowEnergyCharacteristicData

Wird zum Einrichten von GATT-Dienstdaten verwendet

QLowEnergyConnectionParameters

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

QLowEnergyDescriptorData

Wird zum Erstellen von GATT-Dienstdaten verwendet

QLowEnergyServiceData

Wird zum Einrichten von GATT-Dienstdaten verwendet

QMap

Vorlagenklasse, die ein assoziatives Array bereitstellt

QMimeType

Beschreibt Datei- oder Datentypen, die durch eine MIME-Typ-Zeichenkette dargestellt werden

QMqttTopicFilter

Stellt einen MQTT-Themenfilter dar

QMqttTopicName

Stellt einen MQTT-Themennamen dar

QMultiHash

Mehrwertige Hash-Tabelle

QMultiMap

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

QNetworkAddressEntry

Speichert eine von einer Netzwerkschnittstelle unterstützte IP-Adresse 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 auf Netzwerkebene

QNetworkProxyQuery

Wird verwendet, um die Proxy-Einstellungen für einen Socket abzufragen

QNetworkRequest

Enthält eine Anfrage, die mit dem QNetworkAccessManager gesendet werden soll

QNetworkRequestFactory

Hilfsklasse zum Gruppieren von Endpunkten auf Remote-Servern, die gemeinsame Eigenschaften bei Netzwerkanfragen aufweisen

QOpenGLDebugMessage

Umschließt eine OpenGL-Debug-Meldung

QPageRanges

Stellt eine Sammlung von Seitenbereichen dar

QPalette

Enthält Farbgruppen für jeden Widget-Zustand

QPen

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

QPersistentModelIndex

Wird verwendet, um Daten in einem Datenmodell zu lokalisieren

QPicture

Zeichengerät, das QPainter-Befehle aufzeichnet und wiedergibt

QPixmap

Bilddarstellung außerhalb des Bildschirms, die als Zeichenvorrichtung verwendet werden kann

QPolygon

Liste von Punkten mit ganzzahliger Genauigkeit

QPolygonF

Liste von Punkten mit Gleitkommagenauigkeit

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

Musterabgleich mithilfe regulärer Ausdrücke

QRegion

Legt einen Ausschnittbereich für einen Malwerkzeug fest

QRegularExpression

Musterabgleich mithilfe regulärer Ausdrücke

QRegularExpressionMatch

Die Ergebnisse eines Abgleichs eines QRegularExpression mit einer Zeichenkette

QRegularExpressionMatchIterator

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

QSet

Vorlagenklasse, die eine auf einer Hash-Tabelle basierende Menge bereitstellt

QShader

Enthält mehrere Versionen eines Shaders, die in verschiedene Shading-Sprachen übersetzt wurden, zusammen mit Reflection-Metadaten

QSqlField

Bearbeitet die Felder in SQL-Datenbanktabellen und -Ansichten

QSqlQuery

Mittel zur Ausführung und Bearbeitung von SQL-Anweisungen

QSqlRecord

Kapseln einen Datenbankdatensatz

QSslCertificate

Praktische API für ein X509-Zertifikat

QSslCertificateExtension

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

QSslCipher

Stellt eine SSL-Verschlüsselungsmethode 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 Verschlüsselungssuiten mit vorab geteilten Schlüsseln (PSK)

QStack

Vorlagenklasse, die einen Stack bereitstellt

QStaticText

Ermöglicht eine optimierte Darstellung von Text, wenn der Text und sein Layout nur selten aktualisiert werden

QStorageInfo

Stellt Informationen zu aktuell eingebundenen Speichermedien und Laufwerken bereit

QString

Unicode-Zeichenkette

QStringList

Liste von Zeichenfolgen

QTextBlockFormat

Formatierungsinformationen für Textblöcke in einem QTextDocument

QTextBoundaryFinder

Methode zum Ermitteln von Unicode-Textgrenzen in einer Zeichenkette

QTextCharFormat

Formatierungsinformationen für Zeichen in einem QTextDocument

QTextCursor

Bietet eine API zum Zugriff auf und zur Bearbeitung von QTextDocuments

QTextDocumentFragment

Stellt einen Teil eines formatierten Textes aus einem QTextDocument dar

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

Praktische Schnittstelle für die Arbeit mit URLs

QUrlQuery

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

QVariant

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.