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;
谢谢!
答案 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
,正如数字所解释的那样。