Spec-Zone.ru › Qt

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

Многие классы 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 совместно используют данные до тех пор, пока для p2 не будет вызван QPainter::begin(), так как рисование пиксельной карты изменит её.

Предупреждение: Будьте осторожны при копировании контейнера с неявным совместным использованием (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

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

QDnsServiceRecord

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

QDnsTextRecord

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

QFileInfo

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

QFont

Указывает параметры шрифта для вывода текста

QFontInfo

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

QFontMetrics

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

QFontMetricsF

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

QGeoAreaMonitorInfo

Описывает параметры области или региона, которые необходимо отслеживать на предмет близости

QGeoPositionInfo

Содержит информацию, собранную о глобальном положении, направлении и скорости в определенный момент времени

QGeoSatelliteInfo

Содержит основную информацию о спутнике

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

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

QLowEnergyAdvertisingData

Представляет данные, которые необходимо транслировать во время рекламы Bluetooth Low Energy

QLowEnergyAdvertisingParameters

Представляет параметры, используемые для рекламы Bluetooth Low Energy

QLowEnergyCharacteristicData

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

QLowEnergyConnectionParameters

Используется при запросе или сообщении об обновлении параметров подключения Bluetooth LE

QLowEnergyDescriptorData

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

QLowEnergyServiceData

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

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 для доступа к QTextDocument и его изменения

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

Spec-Zone.ru

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