我正在使用PUB/SUB
序列化tcp://
消息后,使用capnp
传输类通道通过ZeroMQ capnp::messageToFlatArray
原型发送消息。在接收方,我以zmq_msg_t
消息的形式接收全部内容。但是zmq_msg_data(&message)
返回的存储位置未对齐capnp::word
。因此,FlatArrayMessageReader
引发了内存未对齐的异常。
简化的代码看起来像这样:
zmq_msg_t message;
zmq_msg_init(&message);
zmq_msg_recv(&message, socket, flags);
size_t size = zmq_msg_size(&message);
auto data = zmq_msg_data(&message);
auto pdata = kj::arrayPtr((const capnp::word*)data, size / sizeof(capnp::word));
capnp::FlatArrayMessageReader msg = capnp::FlatArrayMessageReader(pdata); // exception
什么是在不复制整个缓冲区的情况下对齐数据的好方法?还是有没有办法在字对齐的内存中接收消息而不会降低性能-例如在zmq中禁用零复制?
尝试使用Capnp版本0.7.0,zeromq版本4.3.2和gcc 7.4.0的ubuntu 18.04。
Q:什么是在不复制整个缓冲区的情况下获取数据aligned的好方法?
好吧,鉴于ZeroMQ(按原样)是基于自主运行的Context()
实例引擎,出于相同的性能动机,它已经保证了消息的零复制权,即出于消息的存储位置由Context()
内部策略确定,该内部策略不“看到”,capnp
首选项的“服从”程度越小。
除非一个人重构不仅[ Qzmq_msg_init()
per-se,还要重构ZeroMQ内部所有与性能相关的内部动机,以便从外部“强制”和“保持”某种形式的(这里capnp
为动机,导致示例性的[[“利益冲突”] >>)更高级别的灌输内存管理(对齐分配,重用和释放策略),希望能够从已经成熟,聪明,苗条(按原样)且尺寸合适,功能恰到好处的工具中获得预期的零机会,该工具旨在提供快速,最小延迟但几乎线性的可扩展消息传递/信号工具。
(自v2。+到2020年1月的v4.3,直到v4.3)]]。[可以尝试使用注释来扫描源代码,在这些注释中似乎已经放置了任何此类技巧。