Spec-Zone.ru › Qt 5.9

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

Многие классы 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

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

QStringList

Список строк

QTextBoundaryFinder

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

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-сообщения multipart MIME

QNetworkCookie

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

QNetworkRequest

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

QNetworkConfiguration

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

QDnsDomainNameRecord

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

QDnsHostAddressRecord

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

QDnsMailExchangeRecord

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

QDnsServiceRecord

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

QDnsTextRecord

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

QHostAddress

IP-адрес

QNetworkAddressEntry

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

QNetworkInterface

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

QNetworkProxy

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

QNetworkProxyQuery

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

QSslCertificate

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

QSslCertificateExtension

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

QSslCipher

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

QSslConfiguration

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

QSslDiffieHellmanParameters

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

QSslError

Ошибка SSL

QSslKey

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

QSslPreSharedKeyAuthenticator

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

QSqlField

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

QSqlQuery

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

QSqlRecord

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

QLowEnergyAdvertisingData

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

QLowEnergyAdvertisingParameters

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

QLowEnergyCharacteristicData

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

QLowEnergyConnectionParameters

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

QLowEnergyDescriptorData

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

QLowEnergyServiceData

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

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

Spec-Zone.ru

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