如何在不复制内存的情况下复制ZeroMQ中的消息?
How to copy messages in ZeroMQ without copying the memory?
我正在尝试在 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(©); // 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_copy
有 destination 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 是完全正确的,提供的参数需要是来源。
根据 message_t 的文档,copy
的参数应该是源消息,而不是目标消息。
这段代码应该可以工作(在 Slackware 14.2/GCC6.3 和 MSVC 2017 下测试):
message_t copy;
copy.copy(msg);
另请注意,您不必为复制的消息预分配消息缓冲区。
我正在尝试在 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(©); // 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_copy
有 destination 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 是完全正确的,提供的参数需要是来源。
根据 message_t 的文档,copy
的参数应该是源消息,而不是目标消息。
这段代码应该可以工作(在 Slackware 14.2/GCC6.3 和 MSVC 2017 下测试):
message_t copy;
copy.copy(msg);
另请注意,您不必为复制的消息预分配消息缓冲区。