В настоящее время я делаю что-то вроде этого:
void my_func(std::iostream &a_large_buffer) {
std::vector<std::string> my_lines;
for (std::string line; std::getline(a_large_buffer, line); )
{
// do stuff with line
my_lines.emplace_back(line);
}
// ...
}
my_func
обрабатывает вывод сетевого запроса, в результате чего a_large_buffer
. Данные, которые я получаю, потенциально большие (несколько ГБ).
В настоящее время код обрабатывает данные в буфере, копируя их в строки, которые будут храниться в векторе. Процесс копирования увеличит использование памяти.
Как можно избежать этой ненужной копии ?
Альтернатива: Как удалить данные в части буфер, который я уже прочитал?
Я хотел бы «освободить» данные в буфере после их копирования в line
. Или просто переместите его прямо от a_large_buffer
до line
.
Я не смог найти std::moveline
. Есть ли такая вещь?
Как указано в комментариях, простое решение было бы обработать line
немедленно и не хранить его. Пожалуйста, имейте в виду, что это не вариант здесь. Я должен скопировать (или переместить) line
в my_lines
, поскольку my_lines
будет передано другим функциям.
Быстрый пример:
Я думаю, что если я буду читать из буфера, содержимое в буфере все равно будет там. Я хотел бы изменить это и удалить все после прочтения. Я уверен, что есть способ для этого.
Поиграйте с примером здесь.
Обратите внимание, что в примере используется stringstream, а не iostream.