[英]c++ struct with long long bit field
我對包含位字段的結構有一些疑問。 考慮以下代碼:
#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)
我希望所有結構都適合一個長無符號的長。 但是實際上,這種結構的大小變為sizeof返回的17個字節。 如果我將所有字段類型更改為unsigned long long,則結構大小將變為8個字節。 問題是如何在不將字段類型更改為太多的情況下將結構調整為8個字節。 我在32位計算機上使用VS2013。
通常,在處理位字段時,大小/布局完全取決於編譯器。
奇數結構大小的原因實際上是因為基礎類型( unsigned long long
vs unsigned char
)不同,所以編譯器不會嘗試合並位字段。 當它們都是unsigned long long
,編譯器可以將它們合並為一個8字節的數量。 因此,除了將所有內容更改為unsigned long long
之外,實際上沒有解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.