2013-02-28 72 views
6

我想在C++中使用位字段來實現特定的類大小,但由於某種原因,它比我預期的要大。在C++類中使用位字段的不一致的屬性

問題是,具有32位(4字節)的類正在報告(當作爲參數傳遞給sizeof時)5個字節。實施例類波紋管:

typedef unsigned char u8; 
typedef unsigned int u32; 

class Test { 
    u8 four_bit_field : 4; 
    u8 eight_bit_field; 
    u32 twenty_bit_field : 20; 
}__attribute__((packed)); 

如果four_bit_fieldeight_bit_field位置被切換,sizeof返回正確的大小,4個字節。我相信這可能是內存分配問題。

那麼,有人知道背後的原因?而且,最重要的是,我怎樣才能解決這個問題,而無需轉換任何職位。

回答

10

沒有位數的u8字段正在對齊到下一個字節邊界,而不是與其他位字段打包在一起。因此,您的前4位需要一個字節,後8位需要一個字節,最後20位需要3個字節,總計爲5個。

如果您將位字段大小添加到8位字段,它將工作,請參閱http://ideone.com/Bexw6l

+0

這就是我想,當我說這是一個內存allignment問題。但我正在尋找解決這個問題的方法。 – braunmagrin 2013-02-28 07:14:31

+0

@braunmagrin,我正在測試解決方案,請參閱我的編輯。 – 2013-02-28 07:16:46

+0

我很抱歉匆忙。謝謝,解決了。 – braunmagrin 2013-02-28 07:41:03

2

這確實是一個對齊問題。 u8 eight_bit_field不是一個位字段,它是一個普通的unsigned char(來自該名稱),並且char,signed charunsigned char自然地在字節邊界上對齊。

您因此結束與four_bit_fieldeight_bit_fieldtwenty_bit_field後填充的4的比特之間的填充4比特;後者可能由派生類重用,前者永遠失去。

2

嘗試強制對齊1個字節:

#pragma pack(1) 
class Test { 
    u8 four_bit_field : 4; 
    u8 eight_bit_field : 8; 
    u32 twenty_bit_field : 20; 
}; 
#pragma pack() 
+0

謝謝,我不知道'#pragma'指令。 永遠在學... – braunmagrin 2013-02-28 14:47:49

相關問題