我需要做一些高性能的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++字符串是很困难的,需要花很多心思。你关于如何"避免字符串被释放…"的问题直指问题的核心。唯一的答案是"非常小心"。
简而言之,你确定你需要零拷贝吗?