Я пишу высокопроизводительную коммуникационную библиотеку на основе 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);