Spec-Zone.ru › Qt 5.6

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

Многие классы 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-стиля. См. Проблема итераторов при неявном совместном использовании.

QDebug

Поток вывода для отладки

QDir

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

QFileInfo

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

QProcessEnvironment

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

QStorageInfo

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

QUrl

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

QUrlQuery

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

QPersistentModelIndex

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

QJsonArray

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

QJsonDocument

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

QJsonParseError

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

QJsonObject

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

QJsonValue

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

QVariant

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

QMimeType

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

QBitArray

Массив битов

QByteArray

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

QByteArrayList

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

QCache

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

QCollator

Сравнивает строки в соответствии с алгоритмом сортировки с учетом локали

QCollatorSortKey

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

QCommandLineOption

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

QContiguousCache

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

QDateTime

Функции даты и времени

QHash

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

QMultiHash

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

QLinkedList

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

QList

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

QLocale

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

QMap

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

QMultiMap

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

QQueue

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

QRegExp

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

QRegularExpression

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

QRegularExpressionMatch

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

QRegularExpressionMatchIterator

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

QSet

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

QStack

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

QString

Строка Unicode

QStringList

Список строк

QTextBoundaryFinder

Способ поиска границ текста Unicode в строке

QVector

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

QDBusPendingCall

Ссылается на один ожидающий асинхронный вызов

QDBusUnixFileDescriptor

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

QBitmap

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

QIcon

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

QImage

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

QPicture

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

QPixmap

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

QCursor

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

QKeySequence

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

QPalette

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

QOpenGLDebugMessage

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

QBrush

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

QGradient

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

QPainterPath

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

QPen

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

QPolygon

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

QPolygonF

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

QRegion

Определяет область обрезки для художника

QFont

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

QFontInfo

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

QFontMetrics

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

QFontMetricsF

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

QGlyphRun

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

QRawFont

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

QStaticText

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

QTextCursor

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

QTextDocumentFragment

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

QTextBlockFormat

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

QTextCharFormat

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

QTextFormat

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

QTextFrameFormat

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

QTextImageFormat

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

QTextListFormat

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

QTextTableCellFormat

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

QTextTableFormat

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

QNetworkCacheMetaData

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

QHttpPart

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

QNetworkCookie

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

QNetworkRequest

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

QNetworkConfiguration

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

QDnsDomainNameRecord

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

QDnsHostAddressRecord

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

QDnsMailExchangeRecord

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

QDnsServiceRecord

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

QDnsTextRecord

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

QNetworkAddressEntry

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

QNetworkInterface

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

QNetworkProxy

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

QNetworkProxyQuery

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

QSslCertificate

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

QSslCertificateExtension

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

QSslCipher

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

QSslConfiguration

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

QSslError

Ошибка SSL

QSslKey

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

QSslPreSharedKeyAuthenticator

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

QSqlField

Работает с полями в таблицах и представлениях баз данных SQL

QSqlQuery

Средство выполнения и обработки SQL-запросов

QSqlRecord

Инкапсулирует запись базы данных

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

Spec-Zone.ru

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