为什么这个位域的大小为4?
我有什么方法可以让它有2号尺寸(明显在下面的代码中有意),或者这是不可能干净利落的?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
答案 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}}个字节。