将字符串分配给zmq::message_t而不进行复制



我需要做一些高性能的c++工作,这就是为什么我需要尽可能避免复制数据。

因此,我想直接为zmq::message_t对象分配一个字符串缓冲区,而不复制它。但似乎有一些字符串的释放,从而避免了成功发送。

这是一段代码:

for (pair<int, string> msg : l) {
    comm_out.send_int(msg.first);
    comm_out.send_int(t_id);
    int size = msg.second.size();
    zmq::message_t m((void *) std::move(msg.second).data(), size, NULL, NULL);
    comm_out.send_frame_msg(m, false); // some zmq-wrapper class
}

如何避免在发送消息之前释放字符串?字符串的确切释放时间是什么时候?

问候

我认为zmq::message_t m((void *) std::move(msg.second).data()...可能是未定义的行为,但肯定是问题的原因。在这种情况下,std::move并没有做我怀疑它会做的事情。

std::move的调用实际上是创建一个字符串的匿名临时,将msg.second的内容移动到其中,然后将指向该临时数据的指针传递到message_t构造函数中。0MQ代码假设指针有效,但在message_t的构造函数完成后,即在调用send_frame之前,临时对象将被销毁。

零复制是一个复杂的问题,在0mq(请参阅0mq指南)了解更多详细信息,但你必须确保尚未复制的数据是有效的,直到0mq告诉你它已经完成。

在这种情况下使用C++字符串是很困难的,需要花很多心思。你关于如何"避免字符串被释放…"的问题直指问题的核心。唯一的答案是"非常小心"。

简而言之,你确定你需要零拷贝吗?

最新更新