簡體   English   中英

位域大小不符合預期,為什么?

[英]Bitfield size is not as expected, why?

為什么此位域的大小為4?
我有什么辦法可以使它的大小為2(顯然是在下面的代碼中所預期的),或者這不可能完全做到嗎?

struct S
{
    unsigned short x : 15;
    bool a : 1;
};

int main() { return sizeof(S); }

使用標准C ++不可能做到這一點,但是可以為結構使用編譯器特定的編譯指示或屬性。

在VC ++中,它是#pragma pack

另外,要僅獲得2的大小,您必須執行以下操作:

#pragma pack(1)
struct s{
  unsigned short s1: 15;
  unsigned short b1: 1;
};

在代碼上使用#pragma pack ,如下所示:

struct S
{
    unsigned short x : 15;
    bool a : 1;
};

假設的內存布局為:

----------------------
+ 1 | 2 | 3 | 4 | 5 | ..
+   x   | a |
+---------------------

因此,它占用了3個字節

bool a更改為unsigned short a您會得到以下結果:

-------------------------
+ 1 | 2 | 3 | 4 | 5| ..
+   x |a|
-------------------------

其中僅占用2個字節。

編譯器決定,由於第二個短路僅占用1位,因此可以將結構壓縮為2個字節。 但是,如果使用其他類型的結構成員(例如S的實現中的bool ),則編譯器認為,由於類型不同,它實際上無法將1位壓縮為unsigned short (因為它跨越了類型邊界-不幸的是,實現定義)。 因此,您獲得3個字節的sizeof()而不是2個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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