2017-11-14 7 views
0

Die implizite Freigabe ist ein interessantes Feature von Qt-Wert-Container-Klassen, also benutzerdefinierte implizit gemeinsam genutzte Klassen wäre eine große Leistung und Speicherauslastung, ich bin herauszufinden, wie Sie es implementieren.Implizite Freigabe für benutzerdefinierte Klassen in Qt

Für eine benutzerdefinierte Klasse einige POD Mitglieder und Qt Wertart Mitglieder der implizite gemeinsame Nutzung für jedes Mitglied würde automatisch zur Verfügung enthält, die einen Qt Werttypen wie QString, QByteArray und ...

Bei diesem Ansatz Das Problem ist, dass jedes Mitglied seine spezifische sharedPtr- und Referenzzahl hat, für ein großes Objekt mit mehr als 50 implizit geteilten Mitgliedern, es ist ein Leistungsverlust, um die Referenzzahl jedes Objekts unabhängig zu überprüfen (zum Ablösen) Aus meiner Sicht Daher ist es besser, das gesamte Objekt implizit zu teilen, wodurch der gesamte Speicherverbrauch und die für gemeinsame Klassen benötigten Operationen reduziert werden.

Von COW (Copy on Write) Sicht ist dieser Ansatz besser, weil die Kuh auf kleinere Granularität durchgeführt werden, wie auch immer lesen für nur Objekte es nicht viel wert

Q1 tut: kann mir jemand den Nachteil und Vorteile implizit benutzerdefinierte Klasse, die große Anzahl von Mitgliedern (> 50) teilen von

Q2 erklären: Soweit ich weiß, die implizit geteilt Klasse profitiert von Shared Klasse innerhalb Qt-Namespace , so ist es möglich, eine Gewohnheit zu haben implizit geteilte Klasse überhaupt? Was ist mit Membern von Qt in der benutzerdefinierten Klasse? Ich meine nicht bewegen Semantik von C++ 11, die bereits bekannt ist, die Qt ist stärker

Antwort

1

Die Nachteile und Vorteile der impliziten Freigabe für Klassen mit einer großen Anzahl von Mitgliedern hängt von der Größe der genannten Mitglieder. Und sie sind genau das gleiche wie für andere Klassen wie QString. Sie zahlen eine konstante Zeit für die Referenzzählung für jede Schreiboperation, aber Sie müssen nicht für die tiefe Kopie bezahlen (Speicherzuordnung, Mitgliedsvariable Konstruktoraufrufe usw.), zumindest nicht sofort. Ob Sie für die Referenzzählung zahlen sollten oder nicht, hängt von Ihrem Anwendungsfall ab: Wenn Sie viele read-only-Kopien eines großen Datensatzes erstellen, steigert die implizite Freigabe Ihre Leistung, wenn Sie jedoch viele Kopien kleiner Objekte erstellen Dem wird geschrieben, es gibt keinen Grund zum impliziten Teilen.

QSharedData und QSharedDataPointer sind nützliche Werkzeuge, aber Sie können jede andere Implementierung von Copy-on-Write für Ihre eigenen Klassen verwenden. Auch wenn sie Qt-Klassen enthalten.

Vergleichen Sie auch nicht verschieben Semantik und Copy-on-Write, sie tun verschiedene Dinge.

+0

Danke, ich bemerkte die Verschiebung Semantik im Gegensatz zu keiner tiefen Kopie in implizit freigegebenen Klassen Wie kann ich verschiedene Klassenmitglieder in einem von QSharedData gegebenen rohen Zeiger kapseln? es ist nicht gut dokumentiert –

+1

Sie haben ein vollständiges Beispiel in 'QSharedDataPointer' Dokumentation: http://doc.qt.io/qt-5/qshareddatapointer.html#details –

Verwandte Themen