Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как предотвратить копирование? 
V
    Опции темы
boostcoder
Дата 17.3.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



всем привет.

в следующем коде происходит несколько ненужных копирований:
Код

#include <iostream>
#include <utility>
#include <list>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>

struct io_service {
   typedef size_t id_type;
   typedef boost::function<void()> handler_type;
   typedef boost::function<void()> callback_type;

private:   
   struct private_handler {
      private_handler(handler_type h, callback_type c)
         :_h(h),
         _c(c)
      {
         std::cout << "ctor" << std::endl;
      }
      private_handler(const private_handler& h)
         :_h(h._h),
         _c(h._c)
      {
         std::cout << "copy_ctor" << std::endl;
      }
      
      void operator()() {
         _h();
         _c();
      }
   private:
      handler_type _h;
      callback_type _c;
   };

public:
   typedef std::pair<id_type, private_handler> item_type;
   typedef std::list<item_type> queue_type;

   void post(id_type id, handler_type h) {
      _queue.push_back(std::make_pair(id, private_handler(h, boost::bind(&io_service::private_callback, this))));
   }

private:
   void private_callback() {
   }

   queue_type _queue;
};

void func() {
}

int main() {
   io_service ios;
   
   const size_t count = 4;
   for ( size_t idx = 0; idx < count; ++idx ) {
      ios.post(0, boost::bind(&func));
   }
}


http://liveworkspace.org/code/21a484e5dca1...12d427b632c1a42
выдает такое:
Цитата

ctor
copy_ctor
copy_ctor
copy_ctor
ctor
copy_ctor
copy_ctor
copy_ctor
ctor
copy_ctor
copy_ctor
copy_ctor
ctor
copy_ctor
copy_ctor
copy_ctor



нужно избавиться от копирования вовсе. вариант - в функцию post() передавать и хранить смарт поинтеры.
может есть еще какие-то варианты?

всем спасибо.


Это сообщение отредактировал(а) boostcoder - 17.3.2011, 20:04
PM WWW   Вверх
mes
Дата 17.3.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



http://liveworkspace.org/code/d491b787cc9d...a6067cdc0257164

Добавлено через 42 секунды
Цитата

ctor
copy_ctor
ctor
copy_ctor
...



--------------------
PM MAIL WWW   Вверх
maxim1000
Дата 17.3.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



в зависимости от компилятора могут быть доступны r_value references
тут, по идее, достаточно move-семантики

P.S.
кстати, а зачем избавляться?
это - узкое место в производительности или какие-то другие причины?


--------------------
qqq
PM WWW   Вверх
boostcoder
Дата 17.3.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



mes, спасибо. но интересует полное избавление от копирования.

maxim1000, да, и в производительности тоже. но основная причина в том, чтоб не вводить юзера использующего этот класс в заблуждение. т.к. юзер может быть несколько обескуражен таким поведением, да и намучается бедолага пока поймет в чем причина smile

пока что склоняюсь к тому, чтоб хранить в контейнере указатели или использовать: http://www.boost.org/doc/libs/1_46_0/libs/...iner/index.html
PM WWW   Вверх
mes
Дата 17.3.2011, 22:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



boostcoder, и все таки цель не понятна.. 

Цитата(boostcoder @  17.3.2011,  21:15 Найти цитируемый пост)
. но основная причина в том, чтоб не вводить юзера использующего этот класс в заблуждение.

чем ему обескуражоваться, если ( в частности ) очередь в приватной области ? 

нельзя ли поточнее указать момент вопроса ?






--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.3.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mes @  17.3.2011,  22:28 Найти цитируемый пост)
чем ему обескуражоваться, если ( в частности ) очередь в приватной области ?

ну так это сильно упрощенный код.
в asio::io_service нет возможности определить кол-во хэндлеров в очереди, удалить хэндлеры по некоторому критерию или все. пишу расширение.
PM WWW   Вверх
mes
Дата 18.3.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  18.3.2011,  11:23 Найти цитируемый пост)
в asio::io_service нет возможности определить кол-во хэндлеров в очереди, удалить хэндлеры по некоторому критерию или все.

 smile, для обеспечения возможности контроля поступающего потока, нужна организовывать свою очередь.. 

Цитата(boostcoder @  18.3.2011,  11:23 Найти цитируемый пост)
 пишу расширение. 

ну это как раз понятно было по коду.. 

Цитата(boostcoder @  18.3.2011,  11:23 Найти цитируемый пост)
ну так это сильно упрощенный код.

а вот по сути вопроса там очень мало.. 

не понятна какую идеологию Вы хотите отразить, а следовательно затруднительно сказать какое решение подойдет.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.3.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(boostcoder @  17.3.2011,  22:15 Найти цитируемый пост)
хранить в контейнере указатели или использовать: http://www.boost.org/doc/libs/1_46_0/libs/...iner/index.html 

а фигушки!
asio::io_service не применяет разыменование smile 
PM WWW   Вверх
mes
Дата 18.3.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  18.3.2011,  16:02 Найти цитируемый пост)
asio::io_service не применяет разыменование

проблема на ровном месте.. подсказывать пока не буду.. 
 smile 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.3.2011, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



mes, предлагаете постить в asio::io_service функциональные объекты, в operator() которого производить разыменование и вызов?

как-то через *опу это...
PM WWW   Вверх
mes
Дата 18.3.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  18.3.2011,  16:28 Найти цитируемый пост)
функциональные объекты, в operator() которого производить разыменование и вызов?

Вот вам что надо передать асио ? что у shared_ptr<..> вместо многоточия ?




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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



mes, функциональный объект.

PM WWW   Вверх
mes
Дата 18.3.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  18.3.2011,  16:49 Найти цитируемый пост)
функциональный объект.

где им является определенная Вами структура..  так ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.3.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mes @  18.3.2011,  17:51 Найти цитируемый пост)
где им является определенная Вами структура..  так ?

да. которая приватная. и у нее operator()

Добавлено через 4 минуты и 11 секунд
похоже, Вы все же предлагаете -
Цитата(boostcoder @  18.3.2011,  17:28 Найти цитируемый пост)
постить в asio::io_service функциональные объекты, в operator() которого производить разыменование и вызов?


но не нравится мне это. обертка в обертке.
PM WWW   Вверх
mes
Дата 18.3.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  18.3.2011,  16:52 Найти цитируемый пост)
но не нравится мне это. обертка в обертке. 

так запихните shared_ptr во внутреннюю обертку и потребность во внешней отпадет smile



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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