C++ 压缩位字段的sizeof返回4,但我希望是1。它是怎么来的,我怎么能修复?

C++ 压缩位字段的sizeof返回4,但我希望是1。它是怎么来的,我怎么能修复?,c++,C++,我有一个定义如下的位字段,我希望它的大小为:1: #pragma pack(push, 1) typedef struct { unsigned boolFoo : 1; unsigned pLACEHOLDER : 7; } KnownBitFlags1_t; #pragma pack(pop) 但经过痛苦的调试后,我终于弄明白了sizeofKnownBitFlags1返回4为什么 我还尝试: typedef struct { unsigned boolFoo :

我有一个定义如下的位字段,我希望它的大小为:1:

#pragma pack(push, 1)
typedef struct
{
    unsigned boolFoo  : 1;
    unsigned pLACEHOLDER : 7;
} KnownBitFlags1_t;
#pragma pack(pop)
但经过痛苦的调试后,我终于弄明白了sizeofKnownBitFlags1返回4为什么

我还尝试:

typedef struct
{
    unsigned boolFoo  : 1;
    unsigned pLACEHOLDER : 7;
} __attribute__((packed, aligned(1))) KnownBitFlags1_t;
是什么使结构的大小保持在4


那么,如何停止填充这种结构的数组呢?

这取决于底层类型。将无符号字符更改为无符号字符:


它取决于基础类型。将无符号字符更改为无符号字符:


在您的系统上设计的SizeFun是多少?我猜是2点。还要注意的是,后缀为_t的任何类型都是POSIX保留的。既然您需要一个字节,为什么不使用非原始字符?它在这里也起作用:@Bathsheba:sizeof unsigned是4这对我来说意味着什么?你的代码意味着将有一个无符号变量,其中1位表示boolFoo,7位表示占位符。这句话中的第一个短语已经表明,您将使用与非位域无符号变量一样多的空间。顺便说一句,包括数组存储。在您的系统上sizeofunsigned是多少?我猜是2点。还要注意的是,后缀为_t的任何类型都是POSIX保留的。既然您需要一个字节,为什么不使用非原始字符?它在这里也起作用:@Bathsheba:sizeof unsigned是4这对我来说意味着什么?你的代码意味着将有一个无符号变量,其中1位表示boolFoo,7位表示占位符。这句话中的第一个短语已经表明,您将使用与非位域无符号变量一样多的空间。顺便说一句,包括数组存储。修复了我的所有问题,谢谢。请你解释一下为什么我的结构没有达到我的预期效果好吗?当你使用unsigned的时候,那么整个unsigned int就有了空间,即4个字节。不管实际使用的位是什么。啊,是的,我自己发现的,如果你想改进你的答案,支持它的引号是:一个位字段被解释为一个有符号或无符号的整数类型,由指定数量的位组成。107如果值0或1被存储到一个非零宽度的位字段类型_Bool,位字段的值应与存储的值进行比较。在文件ISO/IEC:9899 TC3第102页第6.7.2.1节第9点中:解决了我所有的麻烦,谢谢。请你解释一下为什么我的结构没有达到我的预期效果好吗?当你使用unsigned的时候,那么整个unsigned int就有了空间,即4个字节。不管实际使用的位是什么。啊,是的,我自己发现的,如果你想改进你的答案,支持它的引号是:一个位字段被解释为一个有符号或无符号的整数类型,由指定数量的位组成。107如果值0或1被存储到一个非零宽度的位字段类型_Bool,位字段的值应与存储的值进行比较。在文件ISO/IEC:9899 TC3第102页第6.7.2.1节第9点中:
typedef struct {
    unsigned char boolFoo  : 1;
    unsigned char pLACEHOLDER : 7;
} KnownBitFlags1_t;