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