Spec-Zone.ru › Qt 5.12

Неявное совместное использование

Многие классы C++ в Qt используют неявное совместное использование данных, чтобы максимизировать использование ресурсов и минимизировать копирование. Неявно разделяемые классы безопасны и эффективны при передаче в качестве аргументов, потому что передается только указатель на данные, а данные копируются только тогда, когда функция записывает в них, то есть копирование при записи.

Обзор

Разделяемый класс состоит из указателя на блок разделяемых данных, который содержит счетчик ссылок и сами данные.

При создании разделяемого объекта счетчик ссылок устанавливается в 1. Счетчик ссылок увеличивается всякий раз, когда новый объект ссылается на разделяемые данные, и уменьшается, когда объект прекращает ссылку на разделяемые данные. Разделяемые данные удаляются, когда счетчик ссылок становится равным нулю.

При работе с разделяемыми объектами существуют два способа копирования объекта. Обычно мы говорим о глубоком и поверхностном копировании. Глубокое копирование подразумевает дублирование объекта. Поверхностное копирование — это ссылка на копирование, т.е. просто указатель на блок разделяемых данных. Создание глубокой копии может быть дорогостоящим с точки зрения памяти и процессора. Создание поверхностной копии очень быстро, так как оно включает только установку указателя и увеличение счетчика ссылок.

Присвоение объекта (с оператором =()) для неявно разделяемых объектов реализуется с использованием поверхностных копий.

Преимущество совместного использования заключается в том, что программе не нужно излишне дублировать данные, что приводит к снижению использования памяти и уменьшению копирования данных. Объекты легко можно присваивать, отправлять в качестве аргументов функций и возвращать из функций.

Неявное совместное использование в основном происходит за кулисами; программисту редко приходится беспокоиться об этом. Однако итераторы контейнеров Qt ведут себя иначе, чем итераторы STL. Прочитайте Проблемы итераторов при неявном совместном использовании.

В многопоточных приложениях неявное совместное использование происходит, как описано в Многопоточность и неявно разделяемые классы.

При реализации собственных неявно разделяемых классов используйте классы QSharedData и QSharedDataPointer.

Подробное описание неявного совместного использования

Неявное совместное использование автоматически отсоединяет объект от разделяемого блока, если объект собирается измениться, а счетчик ссылок больше единицы. (Это часто называют копированием при записи или семантикой значений.)

Неявно разделяемый класс управляет своими внутренними данными. Во всех методах-членах, которые изменяют данные, он автоматически отсоединяется перед изменением данных. Обратите внимание, однако, на особый случай с итераторами контейнеров; см. Проблемы итераторов при неявном совместном использовании.

Класс QPen, который использует неявное совместное использование, отсоединяется от разделяемых данных во всех методах-членах, изменяющих внутренние данные.

Фрагмент кода:

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
    }
}

Список классов

Перечисленные ниже классы автоматически отсоединяются от общих данных, если объект собирается измениться. Программист даже не заметит, что объекты разделяются. Таким образом, вы должны рассматривать отдельные экземпляры как отдельные объекты. Они всегда будут вести себя как отдельные объекты, но с дополнительным преимуществом совместного использования данных, когда это возможно. По этой причине вы можете передавать экземпляры этих классов в качестве аргументов функций по значению, не беспокоясь о накладных расходах на копирование.

Пример:

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();

В этом примере, p1 и p2 разделяют данные до тех пор, пока QPainter::begin() не будет вызван для p2, потому что отрисовка пиксельной карты изменит её.

Предупреждение: Будьте осторожны при копировании неявно разделяемого контейнера (QMap, QVector и т.д.) при использовании итераторов в стиле STL. См. Проблемы итераторов при неявном совместном использовании.

QBitArray

Массив битов

QBitmap

Монохромные (глубина 1 бит) пиксельмапы

QBrush

Определяет узор заливки фигур, нарисованных QPainter

QByteArray

Массив байтов

QByteArrayList

Список массивов байтов

QCache

Шаблонный класс, предоставляющий кэш

QCollator

Сравнивает строки в соответствии с локализованным алгоритмом сортировки

QCollatorSortKey

Может использоваться для ускорения сортировки строк

QCommandLineOption

Определяет возможный параметр командной строки

QContiguousCache

Шаблонный класс, предоставляющий непрерывный кэш

QCursor

Курсор мыши с произвольной формой

QDBusPendingCall

Ссылка на одну ожидающую асинхронную операцию

QDBusUnixFileDescriptor

Содержит один дескриптор Unix-файла

QDateTime

Функции работы с датой и временем

QDebug

Поток вывода для отладочной информации

QDir

Доступ к структурам каталогов и их содержимому

QDnsDomainNameRecord

Хранит информацию о записи доменного имени

QDnsHostAddressRecord

Хранит информацию о записи хост-адреса

QDnsMailExchangeRecord

Хранит информацию о записи DNS MX

QDnsServiceRecord

Хранит информацию о записи DNS SRV

QDnsTextRecord

Хранит информацию о записи DNS TXT

QFileInfo

Независимая от системы информация о файле

QFont

Определяет шрифт, используемый для вывода текста

QFontInfo

Общая информация о шрифтах

QFontMetrics

Информация о метриках шрифта

QFontMetricsF

Информация о метриках шрифта

QGlyphRun

Прямой доступ к внутренним глифам в шрифте

QGradient

Используется совместно с QBrush для задания градиентной заливки

QHash

Шаблонный класс, предоставляющий словарь на основе хеш-таблицы

QHostAddress

IP-адрес

QHttpPart

Содержит часть тела, используемую внутри сообщения HTTP multipart MIME

QIcon

Масштабируемые значки в разных режимах и состояниях

QImage

Независимое от оборудования представление изображения, позволяющее напрямую получить доступ к данным пикселей и может использоваться в качестве устройства рисования

QJsonArray

Оборачивает JSON-массив

QJsonDocument

Способ чтения и записи JSON-документов

QJsonObject

Оборачивает JSON-объект

QJsonParseError

Используется для сообщения об ошибках при разборе JSON

QJsonValue

Оборачивает значение в JSON

QKeySequence

Оборачивает последовательность нажатий клавиш, используемых в сокращениях

QLinkedList

Шаблонный класс, предоставляющий связанные списки

QList

Шаблонный класс, предоставляющий списки

QLocale

Преобразует числа в их строковые представления на разных языках

QMap

Шаблонный класс, предоставляющий словарь на основе красно-черного дерева

QMimeType

Описывает типы файлов или данных, представленных строкой MIME

QMultiHash

Удобный подкласс QHash, предоставляющий многозначные хеши

QMultiMap

Удобный подкласс QMap, предоставляющий многозначные карты

QNetworkAddressEntry

Хранит один IP-адрес, поддерживаемый сетевым интерфейсом, а также его связанную маску подсети и адрес широковещательной рассылки

QNetworkCacheMetaData

Информация о кэше

QNetworkConfiguration

Абстракция одной или нескольких конфигураций точки доступа

QNetworkCookie

Содержит один сетевой cookie

QNetworkInterface

Список IP-адресов и сетевых интерфейсов хоста

QNetworkProxy

Прокси сетевого уровня

QNetworkProxyQuery

Используется для запроса настроек прокси для сокета

QNetworkRequest

Содержит запрос, который должен быть отправлен с QNetworkAccessManager

QOpenGLDebugMessage

Оборачивает сообщение об отладке OpenGL

QPainterPath

Контейнер для операций рисования, позволяющий создавать и повторно использовать графические фигуры

QPalette

Содержит группы цветов для каждого состояния виджета

QPen

Определяет, как QPainter должен рисовать линии и контуры фигур

QPersistentModelIndex

Используется для поиска данных в модели данных

QPicture

Устройство рисования, которое записывает и воспроизводит команды QPainter

QPixmap

Представление изображения вне экрана, которое может использоваться в качестве устройства рисования

QPolygon

Вектор точек с целочисленной точностью

QPolygonF

Вектор точек с плавающей точкой

QProcessEnvironment

Содержит переменные среды, которые могут быть переданы программе

QQueue

Обобщённый контейнер, который предоставляет очередь

QRawFont

Доступ к одному физическому экземпляру шрифта

QRegExp

Сопоставление шаблонов с использованием регулярных выражений

QRegion

Определяет область обрезки для рисовальщика

QRegularExpression

Сопоставление шаблонов с использованием регулярных выражений

QRegularExpressionMatch

Результаты сопоставления QRegularExpression с строкой

QRegularExpressionMatchIterator

Итератор по результатам глобального сопоставления объекта QRegularExpression со строкой

QSet

Шаблонный класс, предоставляющий множество на основе хеш-таблицы

QSslCertificate

Удобный API для сертификата X509

QSslCertificateExtension

API для доступа к расширениям сертификата X509

QSslCipher

Представляет криптографический шифр SSL

QSslConfiguration

Содержит конфигурацию и состояние соединения SSL

QSslDiffieHellmanParameters

Интерфейс для параметров Diffie-Hellman для серверов

QSslError

Ошибка SSL

QSslKey

Интерфейс для закрытых и открытых ключей

QSslPreSharedKeyAuthenticator

Данные аутентификации для шифров предварительно объявленных ключей (PSK)

QStack

Шаблонный класс, предоставляющий стек

QStaticText

Обеспечивает оптимизированный вывод текста, когда текст и его макет обновляются редко

QStorageInfo

Предоставляет информацию о подключенных хранилищах и дисках

QString

Строка Юникод

QStringList

Список строк

QTextBlockFormat

Информация о форматировании блоков текста в QTextDocument

QTextBoundaryFinder

Способ определения границ текста Юникод в строке

QTextCharFormat

Информация о форматировании символов в QTextDocument

QTextCursor

Предлагает API для доступа к QTextDocuments и их изменения

QTextDocumentFragment

Представляет фрагмент форматированного текста из QTextDocument

QTextFormat

Информация о форматировании QTextDocument

QTextFrameFormat

Информация о форматировании фреймов в QTextDocument

QTextImageFormat

Информация о форматировании изображений в QTextDocument

QTextListFormat

Информация о форматировании списков в QTextDocument

QTextTableCellFormat

Информация о форматировании ячеек таблицы в QTextDocument

QTextTableFormat

Информация о форматировании таблиц в QTextDocument

QUrl

Удобный интерфейс для работы с URL

QUrlQuery

Способ манипулирования парами «ключ-значение» в запросе URL

QVariant

Выступает как объединение для наиболее распространенных типов данных Qt

QVector

Шаблонный класс, предоставляющий динамический массив

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/implicit-sharing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API