Итак, если у меня есть такая структура:
//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