如何在不复制内存的情况下在ZeroMQ中复制邮件?

时间:2017-09-12 16:05:59

标签: c++ zeromq

我正在尝试在ZeroMQ中初始化一条消息,我可以多次发送,而不必每次都复制内存。

根据the documentation,可以使用zmq_msg_copy函数(或C ++中的message_t::copy())来完成此操作:

#include <cstdio>
#include <zmq.hpp>
using namespace zmq;

int main() {
    int payload = 5;
    message_t* msg = new message_t((void*)&payload, sizeof(payload));
    message_t copy = message_t(sizeof(payload));
//    msg->copy(&copy); // this fails but does not produce an error
    int status = zmq_msg_copy((zmq_msg_t*)copy.data(), (zmq_msg_t*)msg->data());
    printf("%i\n", status);
}

我用

编译
gcc -lzmq -lstdc++ file.cpp

并运行

./a.out

产生

  

-1

我在这里做错了什么?

源和目标变量:

zmq_msg_copydestination first, source second

int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src);

message_t::copy按以下方式实施:

inline void copy (message_t const *msg_)
{
    int rc = zmq_msg_copy (&msg, const_cast<zmq_msg_t*>(&(msg_->msg)));
    if (rc != 0)
        throw error_t ();
}

所以@vasek是完全正确的,所提供的参数必须是源。

1 个答案:

答案 0 :(得分:2)

根据message_t的文档copy的参数应该是源消息,而不是目的地。

此代码应该有效(在Slackware 14.2 / GCC6.3和MSVC 2017下测试):

message_t copy;
copy.copy(msg);

另请注意,您不必为复制的邮件预分配邮件缓冲区。