我需要做一些高性能的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
}
如何避免在发送邮件之前解除分配字符串?什么时候字符串完全解除分配?
此致
答案 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 ,需要经过深思熟虑。关于如何“避免字符串被解除分配......”的问题直接涉及问题的核心。对此的唯一答案是“非常谨慎”。
简而言之,您确定需要零拷贝吗?