可以在C++类中使用位字段吗?

Don*_*uck 9 c++ class bit-fields

在C结构中,可以指定另一个位长度,而不是类型的默认位长度,如下所示:

struct MyStruct{
    int myVar : 1;    //Size of myVar is 1 bit (so it can take values 0 or 1
    int myOtherVar: 4;    //Size of myOtherVar is 4 bits (so it can take values 0 to 15)
}
Run Code Online (Sandbox Code Playgroud)

这称为位字段.

我的问题是,是否也可以在C++类中执行此操作,如下所示:

class MyClass{
    public:
        //Some methods
    private:
        int m_myAttribute : 1;
        int m_myOtherAttribute : 4;
}
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了这个,但我找到的所有比特字段的例子都使用了结构,而不是类.

我测试了这段代码并且编译得很好,但是我想知道属性的大小是否真的是指定的大小,或者编译器是否忽略了位字段并使用了标准int大小.

Nat*_*ica 8

是的,class可以有比特场成员.在C++中,除了默认访问级别和默认继承类型之外,a class和a 之间没有区别struct.它们都被称为类类型.如果你可以做一些事情,struct那么你可以做一个相同的事情class.由于默认访问级别不同,因此它们看起来会有所不同,但您会得到相同的结果.例如

struct foo
{
    int m_myAttribute : 1;
    int m_myOtherAttribute : 4;
    int m_myOtherOtherAttribute : 27;
};
Run Code Online (Sandbox Code Playgroud)

是相同的

class bar
{
public:
    int m_myAttribute : 1;
    int m_myOtherAttribute : 4;
    int m_myOtherOtherAttribute : 27;
};
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须public:在课堂上使用,因为默认情况下成员是私人的.

现在大约是C++中位字段的大小.[class.bit]/1包含您需要的所有信息:

constant-expression应为具有大于或等于零的值的整数常量表达式.积分常数表达式的值可能大于位域类型的对象表示(3.9)中的位数; 在这种情况下,额外的比特用作填充比特,并且不参与比特字段的值表示(3.9).类对象中位域的分配是实现定义的.位字段的对齐是实现定义的.比特字段被打包到一些可寻址的分配单元中.[注意:位字段跨越某些机器上的分配单元而不是其他机器上的分配单元.在某些机器上从右到左分配位字段,在其他机器上从左到右分配. - 尾注]

强调我的

从这里我们得到bit-feild的大小至少是底层数据类型的大小,但是如果你过度分配空间那么额外的空间就变成了padding而不用于bit-field成员的值.