1

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

如何避免在发送消息之前释放字符串?字符串何时被准确释放?

问候

4

1 回答 1

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 中是一件复杂的事情(更多细节参见 0MQ指南),但是你必须确保没有被拷贝的数据是有效的,直到 0MQ 明确告诉你它已经完成了。

在这种情况下使用 C++ 字符串很难,并且需要很多思考。您关于如何“避免字符串被释放......”的问题直指问题的核心。唯一的答案是“非常小心”。

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

于 2013-08-06T10:17:02.360 回答