Более эффективный способ повторно использовать вектор как массив в Winsock? - PullRequest
2 голосов
/ 07 марта 2009

В настоящее время я использую векторы как массивы в стиле c для отправки и получения данных через Winsock.

У меня есть std :: vector, и я использую его как свой «байтовый массив».

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

Пример:

std::string EndBody("\r\n.\r\n");
std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0);
std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
SendData();

SendData просто вызывает send соответствующее количество раз и гарантирует, что все работает как надо.

Так или иначе. Если я не обнуляю вектор перед каждым использованием, я получаю ошибки с перекрытием вещей. Есть ли для меня более эффективный способ делать то, что я делаю? Потому что кажется, что обнуление всего буфера при каждом вызове ужасно неэффективно.

Спасибо.

Ответы [ 4 ]

1 голос
/ 11 марта 2009

Похоже, что другие постеры фокусируются на стоимости очистки буфера или размере буфера. Однако вам не нужно очищать или обнулять весь буфер или знать его размер для того, что вы делаете. «Ошибки с перекрытием материала» - это проблема SendData, код которой вы не опубликовали. Предположительно, SendData не знает, сколько буфера нужно отправить, если только данные внутри него не заканчиваются нулем. если это предположение верно, все, что вам нужно сделать, это правильно завершить данные нулем.

std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
m_SendBuffer[EndBody.size()] = 0;
SendData();
1 голос
/ 07 марта 2009

вы можете использовать m_SendBuffer.clear ()

в противном случае метод end () не будет знать, каков реальный размер буфера.

clear () - не очень дорогой метод для вызова. Если вы не работаете над 486 или чем-то еще, это не должно влиять на ваши выступления

0 голосов
/ 11 марта 2009

Насколько я понимаю документы STL , вызов clear просто устанавливает значение .end () таким же, как .begin (), и устанавливает размер равным нулю, что мгновенно.

Это не меняет объем выделяемой памяти или ее расположение (любой итератор, очевидно, будет недействительным, но данные будут задерживаться!). .Capacity () не меняется и данные, которые там хранятся, как вы уже обнаружили. Если вы всегда используете итераторы .begin () .end () и STL для доступа к области, это не имеет значения.

Не забывайте, что переменные метода класса не инициализируются, если вы не включите их в свой список инициализации. Добавление m_SendBuffer(BUFSIZE,0) может помочь.

0 голосов
/ 07 марта 2009

Не означает ли, что вызов clear означает, что вектор получает новый размер 0? Если OP использует вектор в качестве большого куска памяти, ему придется затем вызывать resize после clear, чтобы убедиться, что для вызовов и отправки выделено соответствующее пространство.

Вызов clear и изменение размера вектора будет примерно таким же, как просто заполнение нулями, не так ли?

вектор :: ясно

вектор :: размер

заполнения

...