Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QByteArray & move семантик 
:(
    Опции темы
xbarmaglot
Дата 17.5.2017, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Обрабатываю сетевой трафик. Протокол не имеет значение.
Поток разбивается на пакеты и каждый пакет кладется в QByteArray (1-ое копирование).
Этот пакет кладется в очередь реализованную на QQueue (2-ое копирование)
Очередь синхронизированная т.к. много писателей-один читатель.

Далее из очереди выбираются данные для обработки (3-е копирование).
После этого пакет разбирается и далее передается по ссылке в цепочку обязанностей.

Сам пакет константный и не изменяется. По сути хотелось бы один раз в буфер положить пакет, а далее
просто передавать его на обработчики. Можно использовать и умные указатели, то после появления 
move и поддержки его в qt логично было бы просто передавать права владения на объект без копирования.

1. Как это делается в qt? (std::move?)
2. Как реализовать передачу прав владения для очереди и забрать из очереди тоже без глубокого копирования?

PM MAIL   Вверх
ss
Дата 17.5.2017, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
xvr
Дата 18.5.2017, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



В Qt почти все контейнеры реализуют implicit sharing (QByteArray точно реализует), так что никакого копирования данных при копировании самих QByteArray не происходит (пока вы не попытаетесь поменять содержимое какой нибудь копии этого самого QByteArray)

PM MAIL   Вверх
xbarmaglot
Дата 18.5.2017, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



Цитата(xvr @  18.5.2017,  12:10 Найти цитируемый пост)
В Qt почти все контейнеры реализуют implicit sharing (QByteArray точно реализует), так что никакого копирования данных при копировании самих QByteArray не происходит (пока вы не попытаетесь поменять содержимое какой нибудь копии этого самого QByteArray)

отложенное копирование и передача прав владения разве не разные вещи?
PM MAIL   Вверх
xvr
Дата 18.5.2017, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Разное. Но если вы боретесь с оверхедом при передачи контейнера по цепочке обработчиков, то отложенное копирование само по себе сводит этот оверхед практически к нулю. Реализация передачи прав владения в таком окружении уже ничего не даст (с точки зрения уменьшения накладных расходов), ну и собственно просто не имеет смысла.


PM MAIL   Вверх
xbarmaglot
Дата 18.5.2017, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



меня беспокоит не цепочка обязанностей по ссылке, а тройное копирование при помещении пакета в очередь
PM MAIL   Вверх
xvr
Дата 18.5.2017, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(xbarmaglot @  18.5.2017,  14:22 Найти цитируемый пост)
а тройное копирование при помещении пакета в очередь 

Физического копирования данных не происходит, на то и implicit sharing. При присваивании одного QByteArray в другой [пустой] реально происходит копирование 1 поинтера и инкремент 1 целого числа. Так что не беспокойтесь - это очень дешевая операция  smile 

PM MAIL   Вверх
Alexeis
Дата 19.5.2017, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 1
Всего: 459



Цитата(xvr @  18.5.2017,  16:50 Найти цитируемый пост)
Физического копирования данных не происходит, на то и implicit sharing. При присваивании одного QByteArray в другой [пустой] реально происходит копирование 1 поинтера и инкремент 1 целого числа. Так что не беспокойтесь - это очень дешевая операция

   А если я создам копию для использования в другом потоке (передам через асинхронный сигнал слот), после чего 2 потока попытаются одновременно изменить содержимое двух якобы копий? Получится 3 экземпляра, один из которых повиснет в виде утечки памяти?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 19.5.2017, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(Alexeis @  19.5.2017,  10:49 Найти цитируемый пост)
Получится 3 экземпляра, один из которых повиснет в виде утечки памяти? 

Нет. Первое же изменение сделает 2 отдельных копии, которые и будут меняться. То, что они в разных потоках не помешает - счетчик ссылок выполнен на основе атомарных операций, изготовление копии тоже делается в поток безопасном виде.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.