Структура данных, которая обрабатывает несмежные буферы памяти как непрерывный буфер - PullRequest
0 голосов
/ 29 апреля 2018

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

void add_buffer(uint8_t* buffer, size_t buffer_length);

и тогда я смогу получить n bytes с помощью этой функции:

uint8_t* get_buffer(size_t buffer_size, bool& allocated);

Каждый буфер не является смежным с другими буферами, но адрес, возвращаемый вышеуказанной функцией, предназначен для непрерывного блока памяти. Если запрошенный размер буфера от get_buffer меньше или равен первому буферу внутри класса, будет возвращен только начальный адрес первого буфера, но если запрошенный буфер распределен по нескольким вставленным буферам, новая память будет выделены и данные из этих буферов будут скопированы в него и будет возвращен непрерывный адрес памяти.

Теперь я хочу знать, существует ли какая-либо реализация этой структуры данных или нет, более того, как называется эта структура? :) Может быть, если бы я знал ее название, я мог бы найти ее в своих поисках.

1 Ответ

0 голосов
/ 29 апреля 2018

Возможно, вы могли бы использовать boost :: asio :: buffer . буфер представляет собой один буфер. Вы можете объединить несколько из них в «единый непрерывный» буфер с контейнерами std, например, вектор <>. Вы можете добавить буфер в коллекцию с помощью push_back.

Вы можете скопировать содержимое из буфера с помощью

vector<const_buffer> buffers = ...;

vector<unsigned char> data(boost::asio::buffer_size(buffers));
boost::asio::buffer_copy(boost::asio::buffer(data), buffers);

Кстати, если вы разместите немного больше информации о своей проблеме и о том, что вы пытаетесь сделать, вы, вероятно, получите лучшие ответы быстрее. Ваш вопрос очень похож на сценарий разброса / сбора данных из сети или с дискового ввода-вывода.

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