Spec-Zone.ru › Qt 5.14

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

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

Обзор

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

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

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

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

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

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

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

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

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

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

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

Класс 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-адрес

QHttp2Configuration

Управляет параметрами и настройками HTTP/2

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

Интерфейс для параметров Диффи-Хеллмана для серверов

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.14/implicit-sharing.html

Spec-Zone.ru

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