据我所知,c++中类的大小取决于以下因素-
- 所有非静态数据成员的大小
- 数据成员的顺序
- 如果字节填充已启用或未启用
- 其直接基类的大小
- 虚拟函数的存在
- 继承模式(虚拟继承(
现在我已经创建了两个类,如下所示-
class A{
int a;
short s;
int b;
char d;
};// kept a char at last on purpose to leave a "hole"
class B : public A{
char c;
};
现在检查A和B的大小,我看到
- A的大小:16
- 尺寸B:16
我的假设是B类中的字符c被容纳在A类中留下的"洞"中。
但是,让我困惑的是下面的场景,我让会员公开
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
现在尺寸变为
- A的大小:16
- 尺寸B:20
我似乎无法理解造成这种差异的原因。
安腾ABI使用POD的C++03定义来定义"用于布局的POD"类。拥有私有数据成员将取消类作为聚合的资格,因此也取消了C++03:中POD的资格
POD结构是一个没有非静态数据的聚合类非POD结构、非POD联合(或此类类型的数组(类型的成员或引用,并且没有用户定义的副本分配运算符,也没有用户定义的析构函数。
作为POD类将禁用尾部填充重用:
这些类型的dsize、nvsize和nvalign被定义为普通尺寸和排列。这些特性只对用作基类的非空类类型。我们忽略尾部填充POD,因为早期版本的标准没有允许我们将其用于任何其他用途,因为它有时允许更快地复制类型。
因此,在您的第一个示例中,A
不是用于布局目的的POD,其尾部填充可以用于B::c
,但在您的第二个例子中,它是POD,并且其尾部填充不能重复使用。