打包一个带有结构联合的结构

时间:2015-05-19 18:38:35

标签: c struct alignment unions

我在C中遇到了结构打包问题。我希望这个结构的大小为4个字节,所有字段按此顺序排列,但最终填充为8个字节。我猜测问题正在发生,因为dclInputdclOutput正在与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;
    };
};

2 个答案:

答案 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))给了我六个字节。