0

为什么这个位域的大小为 4?
有什么办法可以让它的大小为 2(显然在下面的代码中打算这样做),或者这不可能干净地做到吗?

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

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

1 回答 1

4

使用标准 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 个字节。但是,如果使用了另一种类型的结构成员(例如bool在您的实现中S),编译器认为,由于类型不同,它实际上不能将 1 位压缩到其中unsigned short(因为它跨越了类型边界 - 不幸的是实现定义)。因此你得到3字节sizeof()而不是 2。

于 2013-02-07T11:23:08.450 回答