C ++, как сделать доступными (без копирования) части статического массива в виде массивоподобных объектов? - PullRequest
0 голосов
/ 24 октября 2018

Я пишу высокопроизводительную коммуникационную библиотеку на основе ZMQ , в которой один пакет данных состоит из множества меньших кусков, используемых различными подпрограммами.Я хочу избежать копирования данных.Полученный пакет будет сохранен в структуре сообщения, доступной через общий указатель:

std::shared_ptr<zmq::message_t> response = std::make_shared<zmq::message_t>();
socket.recv (req.get());

Доступ к данным в сообщении может быть получен с помощью стандартного указателя:

uint32_t * msg_data = (uint 32_t *) response.get()->data();

Однако мне нужночтобы получить к ним доступ по-другому.Каждому потребителю должен быть предоставлен свой объект result, который содержит общий указатель на массив response и что-то, что представляет соответствующую часть поля data сообщения как массивоподобный объект.Массив response будет удален, как только последний потребитель прекратит использовать его result.

Если мы предположим, что данные состоят из 100 слов, а 3 блока начинаются с 0-го, 23-го и 65-го слова, результат должен быть подготовлен следующим образом:

shared_ptr<my_sub_array> res1 = std::make_shared<my_sub_array>(response,0,23);
shared_ptr<my_sub_array> res2 = std::make_shared<my_sub_array>(response,23,65);
shared_ptr<my_sub_array> res1 = std::make_shared<my_sub_array>(response,65,100);

Кажется, что my_sub_array может основываться на классе span (с добавлением общего указателя на responseгарантируя, что это не выпущено).Тем не менее, он был введен в C ++ 20, поэтому еще не поддерживается большинством компиляторов.

Существует ли какой-либо официальный и переносимый способ создания подобного массиву представления части массива?

Обновление

По причинам производительности, указанным в комментариях ниже, объекты result должны возвращаться через unique_ptr, а не shared_ptr:

unique_ptr<my_sub_array> res1 = std::make_unique<my_sub_array>(response,0,23);
unique_ptr<my_sub_array> res2 = std::make_unique<my_sub_array>(response,23,65);
unique_ptr<my_sub_array> res1 = std::make_unique<my_sub_array>(response,65,100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...