如何找到结构字段占用的 space 以及它与下一个字段之间的填充?
How to find space occupied by a struct field and the padding between it and the next field?
所以如果我有这样的结构:
//fwd decl
class Payload_t;
//msg class for ipc
struct Msg
{
uint16_t Hdr;
Payload_t Payload; //whatever type I want here
};
我想获取 Msg::Hdr 的大小,包括下一个字段 Msg::Payload 之前的任何填充。
我想要这个是因为我在使用 QNX Neutrino OS 的嵌入式系统中工作。 OS 是传递 OS 的微内核消息。一种常见的技术是用一个简短的 header 设计所有消息,其中包含我的库代码的用户不需要知道的特殊信息,以及一个有效负载(用户关心的部分)。 QNX IOV 设施通过减少复制,在这种情况下可以显着提高性能。他们的 API 是这样工作的:
Msg msg;
iov_t iovReq[2];
//the below causes problems because it doesn't include alignment padding
SETIOV( iovReq + 0, &msg.Hdr, sizeof( msg.Hdr ) );
SETIOV( iovReq + 1, &msg.Payload, sizeof( msg.Payload ) );
然而,我发现:
sizeof( Msg::Hdr ) + sizeof( Msg::Payload ) != sizeof( Msg )
我该怎么做?我见过一些棘手的东西,但不确定最合适的方法。我怀疑答案会涉及一些组合:sizeof、alignof 或宏 offsetof.
带 IOV 的 QNX 多部分消息
http://www.qnx.com/developers/docs/6.6.0.update/#com.qnx.doc.neutrino.getting_started/topic/s1_msg_Multipart_messages.html
对我来说,这听起来很简单:
std::size_t const FirstAndPadding = offsetof(A, Second) - offsetof(A, First);
为什么你想要那个,是另一个问题。
所以如果我有这样的结构:
//fwd decl
class Payload_t;
//msg class for ipc
struct Msg
{
uint16_t Hdr;
Payload_t Payload; //whatever type I want here
};
我想获取 Msg::Hdr 的大小,包括下一个字段 Msg::Payload 之前的任何填充。
我想要这个是因为我在使用 QNX Neutrino OS 的嵌入式系统中工作。 OS 是传递 OS 的微内核消息。一种常见的技术是用一个简短的 header 设计所有消息,其中包含我的库代码的用户不需要知道的特殊信息,以及一个有效负载(用户关心的部分)。 QNX IOV 设施通过减少复制,在这种情况下可以显着提高性能。他们的 API 是这样工作的:
Msg msg;
iov_t iovReq[2];
//the below causes problems because it doesn't include alignment padding
SETIOV( iovReq + 0, &msg.Hdr, sizeof( msg.Hdr ) );
SETIOV( iovReq + 1, &msg.Payload, sizeof( msg.Payload ) );
然而,我发现:
sizeof( Msg::Hdr ) + sizeof( Msg::Payload ) != sizeof( Msg )
我该怎么做?我见过一些棘手的东西,但不确定最合适的方法。我怀疑答案会涉及一些组合:sizeof、alignof 或宏 offsetof.
带 IOV 的 QNX 多部分消息 http://www.qnx.com/developers/docs/6.6.0.update/#com.qnx.doc.neutrino.getting_started/topic/s1_msg_Multipart_messages.html
对我来说,这听起来很简单:
std::size_t const FirstAndPadding = offsetof(A, Second) - offsetof(A, First);
为什么你想要那个,是另一个问题。