Как найти пространство, занимаемое структурным полем и отступом между ним и следующим полем? - PullRequest
0 голосов
/ 01 октября 2018

Итак, если у меня есть такая структура:

//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.ОС - это микроядерная система передачи сообщений.Общепринятым методом является создание всех сообщений с коротким заголовком, который содержит специальную информацию, о которой пользователям моего библиотечного кода не нужно знать, и полезную нагрузку (часть, которая заботит пользователей).Средство 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.

Многочастные сообщения QNX с IOV http://www.qnx.com/developers/docs/6.6.0.update/#com.qnx.doc.neutrino.getting_started/topic/s1_msg_Multipart_messages.html

1 Ответ

0 голосов
/ 01 октября 2018

Для меня это звучит просто:

std::size_t const FirstAndPadding = offsetof(A, Second) - offsetof(A, First);

Зачем вам это нужно, это другой вопрос.

...