使用 zmqpp 进行零拷贝消息传递

Zero-Copy messaging with zmqpp

ZeroCopy messaging 可以在 zeromq 中实现,但是是否可以将它与 zmqpp c++​​ 绑定一起使用?几乎没有文档,我在示例中找不到任何内容...

我会切换到 cppzmq

这是一个更活跃的项目,由一些核心 libzmq 人员维护。

仅 header 并且支持零拷贝。

只需简单地使用 zmqpp::message::copy()。

在zmqpp source code中我们可以看到:

void message::copy(message const& source)
{
    _parts.resize( source._parts.size() );
    for(size_t i = 0; i < source._parts.size(); ++i)
    {
        _parts[i] = source._parts[i].copy();
    }

    // we don't need a copy of the releasers as we did data copies of the internal data,
    //_releasers = source._releasers;
    //_strings = source._strings
}

定义为的_parts:

private:
    typedef std::vector<frame> parts_type;
    parts_type _parts;

所以,source._parts[i].copy() 实际上调用了定义 here:

的 zmqpp::frame::copy()
frame frame::copy() const
{
    frame other( size() );
    other._sent = _sent;

    if( 0 != zmq_msg_copy( &other._msg, const_cast<zmq_msg_t*>(&_msg) ) )
    {
        throw zmq_internal_exception();
    }

    return other;
}
代码段中的

zmqpp::frame::_msg 定义为 zmq_msg_t。源 zmqpp::message 对象的框架对象中的所有 zmq_msg_t 对象都被 zmq_msg_copy 零复制到新的 zmqpp::message 对象。

所以,zmqpp::message::copy() 帮助我们得到一个新的 zmqpp::message 对象,它的所有帧都是从源 zmqpp::message 对象复制的零。