C ++如何使静态数组的某些部分(而不是复制)作为类数组对象可用?

时间:2018-10-24 18:45:49

标签: c++ arrays sub-array

我正在写一个基于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);

0 个答案:

没有答案