[英]Bitfield size is not as expected, why?
为什么此位域的大小为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个字节。
编译器决定,由于第二个短路仅占用1位,因此可以将结构压缩为2个字节。 但是,如果使用其他类型的结构成员(例如S
的实现中的bool
),则编译器认为,由于类型不同,它实际上无法将1位压缩为unsigned short
(因为它跨越了类型边界-不幸的是,实现定义)。 因此,您获得3
个字节的sizeof()
而不是2个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.