嵌套结构数组的大小是如何决定的?

时间:2014-05-23 11:52:15

标签: c struct memory-alignment packing

N.B:这与Effects of __attribute__((packed)) on nested array of structures?

类似,但不完全相同

我正在定义一个包含多个嵌套结构的结构类型。 其中一个成员是一个打包结构的数组,让我稍微混淆它应该嵌套的顺序,相对于先让较大成员的规范。

如果成员是一个结构数组,每个结构为8个字节,长度为4,则该成员总共32个字节被视为用于打包和对齐的单个实体,使得另一个结构成员,例如18字节,实际上更小?

e.g

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 个答案:

答案 0 :(得分: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,正如数字所解释的那样。