Как определяется размер вложенных структурных массивов?

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, как цифры объясняет.

Другие вопросы по тегам