2015-05-19 165 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。 –

相關問題