2014-01-08 57 views
1

我有一些問題,包括位字段的結構。考慮下面的代碼:C++結構長long位字段

#pragma pack(push, 1) 
struct DATA_WARNINGS { 
    unsigned char fl_num  : 8; 
    unsigned char dev_reload : 1; 
    unsigned char    : 1; 
    unsigned long long flags : 54; 
}; 
#pragma pack(pop) 

這樣的結構的大小是10個字節的預期。我想要做的是在不改變位域的寬度的情況下以8個字節來適應這個結構。所以我所做的是將第一個字段的類型改爲unsigned long long。像這樣:

#pragma pack(push, 1) 
struct DATA_WARNINGS { 
    unsigned long long fl_num : 8; 
    unsigned char dev_reload : 1; 
    unsigned char    : 1; 
    unsigned long long flags : 54; 
}; 
#pragma pack(pop) 

我預計所有結構都適合一個無符號long long。但實際上這種結構的大小變成了sizeof返回的17個字節。如果我將所有字段類型更改爲無符號長整型比結構大小變爲8個字節。 問題是如何在不改變字段類型的情況下適合8字節的結構。我在32位機器上使用VS2013。

回答

2

通常,處理位域時,大小/佈局完全取決於編譯器。

奇數結構尺寸的原因實際上是因爲底層類型(unsigned long longunsigned char)不同,因此編譯器不會嘗試合併位字段。當它們都是unsigned long long時,編譯器可以將它們合併成一個8字節的數量。因此,除了將所有內容都更改爲unsigned long long之外,沒有任何解決方法。