我在C中遇到了结构打包问题。我希望这个结构的大小为4个字节,所有字段按此顺序排列,但最终填充为8个字节。我猜测问题正在发生,因为dclInput
和dclOutput
正在与4字节边界对齐。是否有可能告诉编译器不对齐这些结构,只是相信我不会要求指向任何一个?我尝试过使用#pragma pack(1)
,但这没有用。编辑:不幸的是,__attribute__((packed))
也不起作用 - 大小仍然最终为8个字节。
struct _IL_OPCODE {
unsigned code : 16;
union {
struct {
unsigned usage : 5;
unsigned mode : 3;
unsigned : 1;
unsigned bias : 1;
unsigned invert : 1;
unsigned centered : 1;
unsigned : 4;
} dclInput;
struct {
unsigned id : 8;
unsigned type : 4;
unsigned : 3;
unsigned unnormalize : 1;
} dclResource;
};
};
答案 0 :(得分:1)
有些编译器可以使用,但不是可移植的C,所以你可能不应该依赖它。
例如,在gcc中,您可以使用packed
类型属性:
struct _IL_OPCODE {
unsigned code : 16;
union {
struct {
...
} __attribute__ ((packed))
答案 1 :(得分:0)
您是否在结构或联盟之前放置了#pragma pack(1)
?
#pragma pack(1) // Put it here OR
struct _IL_OPCODE {
unsigned code : 16;
#pragma pack(1) // here
union {
struct {
unsigned usage : 5;
unsigned mode : 3;
unsigned : 1;
unsigned bias : 1;
unsigned invert : 1;
unsigned centered : 1;
unsigned : 4;
} dclInput;
struct {
unsigned id : 8;
unsigned type : 4;
unsigned : 3;
unsigned unnormalize : 1;
} dclResource;
};
};
我可以将这个大小减少到四个字节。 __attribute__ ((packed))
给了我六个字节。