2015-05-19 104 views
1

我遇到了一个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; 
    }; 
}; 
+1

您正在使用哪种编译器?对于GCC,它应该是'__attribute__((__packed __))' –

回答

1

它可能与一些编译器,但不是可移植的C,所以你可能不应该依赖它。

例如,在海湾合作委员会,你可以使用packed类型属性:

struct _IL_OPCODE { 
    unsigned code : 16; 
    union { 
     struct { 
    ... 
    } __attribute__ ((packed)) 
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))给了我六个字节。

+0

'#pragma pack(1)'是Visual C的方式,'__attribute __((packed))'是gcc方式。我相信,这两个编译器都会忽略“其他”方式。其他编译器我做的不同。因此“不便携”。 – BadZen

+0

我不知道Visual C忽略'gcc'的方式,但gcc确实支持'#pragma pack'。有关信息,请参阅https://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html。 –