Как говорили другие, вы сталкиваетесь с заполнением ваших структур. Ничто в самом языке Си не может эффективно предотвратить это. Ваш компилятор может иметь некоторое расширение для pack вещей, например, gcc реализует это как attribute
. Но для того, чтобы все было по-настоящему упаковано, вам нужно изменить порядок полей в порядке возрастания или убывания, чтобы промежутки выравнивания были как можно меньше.
Кроме того, использование битовых полей для таких структур, как правило, является плохой идеей. Если они у вас есть, используйте целочисленные типы C99 фиксированного размера, как показано ниже:
typedef struct BaseMessage
{
int32_t u32DeviceID;
int32_t u32CoreID;
uint16_t u16Class;
uint16_t u16CRC;
uint8_t u8OpCode;
} BaseMessage;
В этом случае, если ваш компилятор выровнен на 16 бит (редко в наши дни), вы можете просто потратить 8 дополнительных битов на BaseMessage
.