簡體   English   中英

具有長位字段的C ++結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM