比特场大小不如预期,为什么?

时间:2013-02-07 11:06:38

标签: c++ visual-c++ bit-fields

为什么这个位域的大小为4?
我有什么方法可以让它有2号尺寸(明显在下面的代码中有意),或者这是不可能干净利落的?

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

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

1 个答案:

答案 0 :(得分: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()获得{{1}}个字节。