Я хочу создать буфер символов, записать в него, используя sprintf, а затем передать его нескольким вызовам async_write () (т.е. распространить его среди клиентов).Мой вопрос: какая структура данных лучше всего использовать для этого?Если есть компромиссы, то я предполагаю, что приоритеты для определения «наилучшего» будут следующими:
- меньше циклов ЦП
- ясность кода
- меньше использования памяти
Вот то, что у меня есть в данный момент, похоже, работает:
function broadcast(){
char buf[512];
sprintf(buf,"Hello %s","World!");
boost::shared_ptr<std::string> msg(new std::string(buf));
msg->append(1,0); //NUL byte at the end
for(std::vector< boost::shared_ptr<client_session> >::iterator i=clients.begin();
i!=clients.end();++i) i->write(buf);
}
Тогда:
void client_session::write(boost::shared_ptr<std::string> msg){
if(!socket->is_open())return;
boost::asio::async_write(*socket,
boost::asio::buffer(*msg),
boost::bind(&client_session::handle_write, shared_from_this(),_1,_2,msg)
);
}
ПРИМЕЧАНИЯ:
- Типичное сообщениеразмер будет меньше 64 байт;размер буфера 512 - просто паранойя.
- Я передаю NUL-байт, чтобы отметить конец каждого сообщения;это часть протокола.
msg
должен превзойти мой первый фрагмент кода (требование asio), следовательно, использование общего указателя.
Я думаюЯ могу сделать лучше, чем это по всем моим критериям.Я задавался вопросом об использовании boost :: shared_array?Или создать asio :: buffer (обернутый в умный указатель) прямо из моего char buf [512]?Но чтение документации по этим и другим вариантам оставило меня перегруженным всеми возможностями.
Кроме того, в моем текущем коде я передаю msg в качестве параметра handle_write (), чтобы гарантировать, что умный указатель не будет освобожден, пока handle_write() достигнут.Это требуется, не так ли?
ОБНОВЛЕНИЕ: Если вы можете утверждать, что в целом это лучше, я открыт для замены sprintf
на std::stringstream
или аналогичный.Суть вопроса в том, что мне нужно составить сообщение и затем передать его, и я хочу сделать это эффективно.
ОБНОВЛЕНИЕ № 2 (26 февраля 2012 г.): я ценюнеприятные люди пошли публиковать ответы, но я чувствую, что никто из них не ответил на этот вопрос.Никто не опубликовал код, показывающий лучший способ, и не дал никаких цифр, чтобы поддержать их.На самом деле у меня создается впечатление, что люди думают, что нынешний подход так же хорош, как и сейчас.