我在派生类中遇到了位域(bitfields)的问题。
使用g++编译器,您可以将
我期望class C和class A有一样的内容,布局也应该相同,即占用4个字节。然而,实际情况是C占用了5个字节。所以我的问题是,我是否做错了什么,如果是,是什么?或者这是编译器的问题?是一个疏忽,还是一个真正的错误?我试着搜索了一下,但并没有找到什么有用的信息,除了Linux和Windows之间的差异(编译器试图模拟MSVC),但我对此不感兴趣。这只是在Linux上发生的事情。
使用g++编译器,您可以将
__attribute__((packed))
赋予一个类,它将对位域进行压缩。所以,class A
{
public:
int one:10;
int two:10;
int three:10;
} __attribute__ ((__packed__));
只占用4个字节。目前为止,一切都很好。
然而,如果你继承一个类,就像这样:
class B
{
public:
int one:10;
int two:10;
} __attribute__ ((__packed__));
class C : public B
{
public:
int three:10;
} __attribute__ ((__packed__));
我期望class C和class A有一样的内容,布局也应该相同,即占用4个字节。然而,实际情况是C占用了5个字节。所以我的问题是,我是否做错了什么,如果是,是什么?或者这是编译器的问题?是一个疏忽,还是一个真正的错误?我试着搜索了一下,但并没有找到什么有用的信息,除了Linux和Windows之间的差异(编译器试图模拟MSVC),但我对此不感兴趣。这只是在Linux上发生的事情。
C c; B &b1 = c; /* ... */ B b2; /* ... */ b1 = b2;
. 采用你建议的打包方式后,最后这个赋值会变得更加复杂。 - user743382b1 = b2;
不是指位域,它复制整个类。这将是一个非常特殊的类,其中该类是 POD,但复制类并不仅仅是复制字节。 - user743382