位字段大小与预期不一样,原因是什么

Bitfield size is not as expected, why?

本文关键字:不一样 是什么 字段      更新时间:2023-10-16

为什么这个位字段的大小为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个字节。

编译器决定,由于第二个short只占用1位,因此可以将结构压缩为2个字节。但是,如果使用了另一种类型的结构成员(例如S实现中的bool),编译器会认为,由于类型不同,它实际上无法将1位压缩到unsigned short中(因为它跨越了类型边界——不幸的是,实现定义了)。因此,sizeof()得到的是3字节,而不是2字节。

相关文章: