|
|
|
xbarmaglot |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
Обрабатываю сетевой трафик. Протокол не имеет значение.
Поток разбивается на пакеты и каждый пакет кладется в QByteArray (1-ое копирование). Этот пакет кладется в очередь реализованную на QQueue (2-ое копирование) Очередь синхронизированная т.к. много писателей-один читатель. Далее из очереди выбираются данные для обработки (3-е копирование). После этого пакет разбирается и далее передается по ссылке в цепочку обязанностей. Сам пакет константный и не изменяется. По сути хотелось бы один раз в буфер положить пакет, а далее просто передавать его на обработчики. Можно использовать и умные указатели, то после появления move и поддержки его в qt логично было бы просто передавать права владения на объект без копирования. 1. Как это делается в qt? (std::move?) 2. Как реализовать передачу прав владения для очереди и забрать из очереди тоже без глубокого копирования? |
|||
|
||||
ss |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 131 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
auto arr = QByteArray::fromRawData(srcPtr, size) - это указывает на данные. "=" - Данные не скопирует т.к. этот оператор перегружен для временного объекта (rvalue)
inline QByteArray &operator=(QByteArray &&other) Q_DECL_NOTHROW { qSwap(d, other.d); return *this; } еще вот такая функ qSwap(). Это сообщение отредактировал(а) ss - 17.5.2017, 20:35 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
В Qt почти все контейнеры реализуют implicit sharing (QByteArray точно реализует), так что никакого копирования данных при копировании самих QByteArray не происходит (пока вы не попытаетесь поменять содержимое какой нибудь копии этого самого QByteArray)
|
|||
|
||||
xbarmaglot |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
отложенное копирование и передача прав владения разве не разные вещи? |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Разное. Но если вы боретесь с оверхедом при передачи контейнера по цепочке обработчиков, то отложенное копирование само по себе сводит этот оверхед практически к нулю. Реализация передачи прав владения в таком окружении уже ничего не даст (с точки зрения уменьшения накладных расходов), ну и собственно просто не имеет смысла.
|
|||
|
||||
xbarmaglot |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
меня беспокоит не цепочка обязанностей по ссылке, а тройное копирование при помещении пакета в очередь
|
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Физического копирования данных не происходит, на то и implicit sharing. При присваивании одного QByteArray в другой [пустой] реально происходит копирование 1 поинтера и инкремент 1 целого числа. Так что не беспокойтесь - это очень дешевая операция |
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 1 Всего: 459 |
А если я создам копию для использования в другом потоке (передам через асинхронный сигнал слот), после чего 2 потока попытаются одновременно изменить содержимое двух якобы копий? Получится 3 экземпляра, один из которых повиснет в виде утечки памяти? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Нет. Первое же изменение сделает 2 отдельных копии, которые и будут меняться. То, что они в разных потоках не помешает - счетчик ссылок выполнен на основе атомарных операций, изготовление копии тоже делается в поток безопасном виде. |
|||
|
||||
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |