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

时间:2013-08-06 07:41:25

标签: string move zeromq zero-copy

我需要做一些高性能的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
}

如何避免在发送邮件之前解除分配字符串?什么时候字符串完全解除分配?

此致

1 个答案:

答案 0 :(得分:1)

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

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

零拷贝在0mq中是一个复杂的问题(参见the 0MQ Guide)以获取更多详细信息,但您必须确保未复制的数据有效,直到0MQ明确告知您已完成它

在这种情况下使用C ++字符串 hard ,需要经过深思熟虑。关于如何“避免字符串被解除分配......”的问题直接涉及问题的核心。对此的唯一答案是“非常谨慎”。

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