繁体   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