我正在写一个基于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个字组成,并从0、23和65个字开始有3个块,则结果应按以下方式准备:
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);