【问题标题】:Why does the size of class in c++ depend on the public/private status of data members?为什么 c++ 中类的大小取决于数据成员的公共/私有状态?
【发布时间】:2020-03-16 12:32:33
【问题描述】:

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

  1. 所有非静态数据成员的大小。
  2. 数据成员的顺序。
  3. 是否启用了字节填充。
  4. 其直接基类的大小。
  5. 虚函数的存在。
  6. 继承方式(虚拟继承)。

现在我创建了如下 2 个类 -

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

我似乎无法理解造成这种差异的原因。

【问题讨论】:

  • 为什么 c++ 中类的大小取决于数据成员的公共/私有状态? -- 不。这些是依赖于编译器的实现细节。
  • 那么你用的是什么编译器?
  • @PaulMcKenzie 实际上确实如此。该标准要求将具有相同访问权限的成员分组在一起,因此更改会改变编译器的填充策略。
  • @NathanOliver-ReinstateMonica,我不知道。您是否有机会参考相关部分?
  • @RSahu 查找它以立即输入我的答案。

标签: c++ inheritance memory


【解决方案1】:

Itanium ABI uses the C++03 definition of POD 定义“用于布局的 POD”类。在 C++03 中,拥有私有数据成员会导致类无法成为聚合,因此也无法成为 POD:

POD-struct 是一个没有非静态数据的聚合类 非 POD 结构、非 POD 联合(或此类类型的数组)类型的成员 或引用,并且没有用户定义的复制赋值运算符,也没有 用户定义的析构函数。

成为 POD 类disables tail padding reuse:

这些类型的 dsize、nvsize 和 nvalign 被定义为它们的 普通尺寸和对齐方式。这些属性只对 用作基类的非空类类型。我们忽略尾巴 POD 的填充,因为该标准的早期版本没有 允许我们将其用于其他任何事情,因为它有时允许 更快地复制类型。

因此,在您的第一个示例中,A 不是用于布局目的的 POD,其尾部填充可用于 B::c,但在您的第二个示例中,它是一个 POD,其尾部填充不能重复使用.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2013-10-10
    • 2016-04-30
    • 1970-01-01
    • 2017-04-02
    • 2013-05-03
    • 2013-06-08
    相关资源
    最近更新 更多