Как определяется размер вложенных структурных массивов?
NB: Это похоже, но не совсем то же самое, что Эффекты __attribute__((упакованные)) на вложенный массив структур?
Я определяю тип структуры, который содержит несколько вложенных структур. Один из членов представляет собой массив упакованных структур, в котором я немного запутался в том порядке, в котором он должен быть вложен, по сравнению с нормой наличия вначале более крупных элементов.
если элемент представляет собой массив структур размером 8 байт каждая, длиной 4, то элемент является общим 32 байтом, который рассматривается как единичный объект для упаковки и выравнивания, что делает еще один элемент структуры, скажем, 18 байтов, фактически меньше?
например
typedef struct __attribute__((__packed__)) settingsProfile {
/* For packing and alignment, is this member 32 bytes or 4 'chunks'(?) of 8 bytes?*/
struct __attribute__((__packed__)) load {
int32_t slewRate;
int32_t current;
} load[4];
/* 18 bytes, so if the above *isn't* 32 it should be below this */
struct __attribute__((__packed__)) ac {
int32_t slewRate;
int32_t voltage;
int32_t iLimit;
int32_t ovp;
bool dcMode;
};
struct __attribute__((__packed__)) xfmr { // 4 bytes
int32_t ocp;
} xfmr;
uint16_t extOtp[2]; // 4 bytes
} settingsProfile_t;
Спасибо!
1 ответ
Это struct
тип не переменная:
...
/* 18 bytes, so if the above *isn't* 32 it should be below this */
struct __attribute__((__packed__)) ac {
int32_t slewRate;
int32_t voltage;
int32_t iLimit;
int32_t ovp;
bool dcMode;
};
...
поэтому его размер не будет включен в sizeof(settingsProfile_t)
,
Вы можете искать:
typedef struct __attribute__((__packed__)) settingsProfile {
uint16_t extOtp[2]; // 4 bytes
struct __attribute__((__packed__)) xfmr { // 4 bytes
int32_t ocp;
} xfmr;
// total 17
struct __attribute__((__packed__)) ac {
int32_t slewRate; // 4
int32_t voltage; // 4
int32_t iLimit; // 4
int32_t ovp; // 4
bool dcMode; // 1
} foo; // << ***here***
// total 32
struct __attribute__((__packed__)) load {
int32_t slewRate; // 4
int32_t current; // 4
} load[4];
} settingsProfile_t;
В моем компиляторе итого sizeof(settingsProfile_t)
, является 57
, как цифры объясняет.