参见在线示例:Ideone示例
struct {
union {
struct {
uint32_t messageID : 26;
uint8_t priority : 3;
} __attribute__ ((packed));
uint32_t rawID : 29;
} __attribute__ ((packed));
uint8_t canFlags : 3;
} __attribute__ ((packed)) idSpecial;
为什么编译器将结构的大小报告为5个字节而不是4个字节?它应该包含32位。
这是因为内存对齐:编译器不会canFlags
在字节的中间开始,而是在下一个字节的开始(可能*)开始。因此,您有四个字节用于您的初始联合,一个字节用于canFlags
。
例如,如果您移入canFlags
联合,则(可能*)大小为4:
typedef struct structTag {
union {
struct {
uint32_t messageID : 26; /* 26bit message id, 67108864 ids */
uint8_t priority : 3; /* priority: MUST BE 0 */
} __attribute__ ((packed));
uint32_t rawID : 29;
uint8_t canFlags : 3; /* <==== Moved */
} __attribute__ ((packed));
} __attribute__ ((packed)) idSpecial;
更新了有关ideone的示例。显然,特定的更改可能不是您想要的。我只是在说明问题是在字节边界上开始一个新字段。
*“可能”,因为最终取决于编译器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句