为什么这个位域的大小为 4?
有什么办法可以让它的大小为 2(显然在下面的代码中打算这样做),或者这不可能干净地做到吗?
struct S
{
unsigned short x : 15;
bool a : 1;
};
int main() { return sizeof(S); }
为什么这个位域的大小为 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 个字节。但是,如果使用了另一种类型的结构成员(例如bool
在您的实现中S
),编译器认为,由于类型不同,它实际上不能将 1 位压缩到其中unsigned short
(因为它跨越了类型边界 - 不幸的是实现定义)。因此你得到3
字节sizeof()
而不是 2。