Присоединение к буферу в C ++ - PullRequest
3 голосов
/ 30 марта 2012

Я пытаюсь эффективно преобразовать содержимое карты в строку для отправки через сокет.У меня это пока ...

char buffer[1024];
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
    sprintf(buffer, "%s|%ld|%d", buffer, iter->first, iter->second);
}

Пока это работает, мне было интересно, неэффективно ли это.Google ищет наиболее эффективный способ преобразования int / long / doubles в строку, что привело к sprintf, поэтому я использую его.Но меня беспокоит, что содержимое буфера копируется снова и снова, тогда как я просто хочу добавить в конец.Это правильно, и если так, есть ли лучший способ сделать это?Производительность и скорость - приоритет №1.

Спасибо!

Ответы [ 4 ]

5 голосов
/ 30 марта 2012

Вы правы;предложенное здесь решение будет копировать буфер каждый раз.Чтобы добиться большего, вам нужно будет использовать возвращаемое значение sprintf.

char buffer[1024];
char* end_of_buffer = buffer;
std::size_t remaining_space = sizeof(buffer);

for (auto iter = my_map.begin(); iter != my_map.end(); iter++)
{
    int written_bytes = snprintf(end_of_buffer, remaining_space, "|%ld|%d", iter->first, iter->second);

    if (written_bytes > 0) {
        end_of_buffer += written_bytes;
        remaining_space -= written_bytes;
    } else {
        perror("Something is wrong with the buffer");
    }
}

Обратите внимание, кстати, что я использовал snprintf, который отслеживает оставшуюся длину буфера.Вы должны всегда использовать это вместо небезопасной версии.Ваше приложение будет развиваться, и благодаря великому творчеству вы найдете способ переполнить этот буфер.Между тем безопасность сводится к нулю дополнительных затрат.

(я имею в виду, без обид, конечно.)

5 голосов
/ 30 марта 2012

Вы должны использовать std::ostringstream s, они эффективны и более C ++ - ish:

#include <sstream>

std::ostringstream oss;
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
    oss << iter->first << "|" << iter->second;
    //oss.str() returns the string in which everything was stored.
}

После этого вы все равно можете использовать operator<< для добавления материала в конце ostringstream.

2 голосов
/ 30 марта 2012

Вы передали буфер sprintf как входные и выходные данные.Это неопределенное поведение.

0 голосов
/ 30 марта 2012

Возможно, вам следует вместо этого использовать stringstream, но если вы хотите большей эффективности, тогда я полагаю, что вы можете использовать прямой символ * для своего буфера, вам просто нужно убедиться, что вы увеличите его, если вы не знаете, что он не будет превышать 1024 байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...