为什么c++中类的大小取决于数据成员的公共/私有状态



据我所知,c++中类的大小取决于以下因素-

  1. 所有非静态数据成员的大小
  2. 数据成员的顺序
  3. 如果字节填充已启用或未启用
  4. 其直接基类的大小
  5. 虚拟函数的存在
  6. 继承模式(虚拟继承(

现在我已经创建了两个类,如下所示-

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,并且其尾部填充不能重复使用。

最新更新