это связано со структурой упаковки. добавляя поле tm
к sSpecificData, вы изменяете его из структуры с естественным выравниванием int (4 байта) на нечто, имеющее естественное выравнивание, которое выглядит как 8 байтов.
так что с tm
как частью sSpecificData
структура sMyData
фактически является
typedef struct {
int m_Id;
// 4 bytes of padding inserted to align sSpecificData on an 8 byte boundary.
sSpecificData m_Data; // with tm, this has a alignment of 8
} sMyData;
это объясняет, что вы видите. Чтобы это исправить, вы можете добавить явное значение заполнения для sMyData AND в sData.
typedef struct
{
int m_Id;
int m_padding;
sDataBuffer m_Data; // this accepts structures with an alignment of up to 8
} sData;
typedef struct {
int m_Id;
int m_padding;
sSpecificData m_Data; // with tm, this has a alignment of 8
} sMyData;
Или вы можете использовать #pragma pack(4)
(если ваш компилятор c поддерживает это), чтобы принудительно исключить заполнение из sMyData, но это приведет к смещению tm
, что не очень хорошая идея. см. этот связанный вопрос.
очень похожий вопрос возник сегодня о C #, но проблемы те же, хотя синтаксис для определения упаковки отличается)
Размер структур в .NET