Spec-Zone.ru › Qt 6.1

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

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

QBitArray

Массив битов

QBitmap

Монохромные (глубина 1 бит) растровые изображения

QBrush

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

QByteArray

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

QByteArrayList

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

QByteArrayView

Вид на массив байтов с чтением только подмножества API QByteArray

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-типа

QMqttTopicFilter

Представляет фильтр темы MQTT

QMqttTopicName

Представляет имя темы MQTT

QMultiHash

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

QMultiMap

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

QNetworkAddressEntry

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

QNetworkCacheMetaData

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

QNetworkCookie

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

QNetworkInterface

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

QNetworkProxy

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

QNetworkProxyQuery

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

QNetworkRequest

Хранит запрос, который будет отправлен с QNetworkAccessManager

QOpenGLDebugMessage

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

QPageRanges

Представляет коллекцию диапазонов страниц

QPainterPath

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

QPalette

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

QPen

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

QPersistentModelIndex

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

QPicture

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

QPixmap

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

QPolygon

Список точек с целочисленной точностью

QPolygonF

Список точек с плавающей точкой

QProcessEnvironment

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

QQueue

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

QRawFont

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

QRegExp

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

QRegion

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

QRegularExpression

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

QRegularExpressionMatch

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

QRegularExpressionMatchIterator

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

QSet

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

QSqlField

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

QSqlQuery

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

QSqlRecord

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

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

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

Spec-Zone.ru

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