为什么从聚合继承时对齐填充规则不同?

问题描述

如果我们有这个类:

class NotAggregate
{
    double foo;
    int bar;
};

大小为 16 字节,因为需要 4 字节的填充才能正确对齐。

如果我们从这个类继承

struct NotAggregateChild : public NotAggregate
{
    int baz;
};

sizeof(NotAggregateChild) 仍然是 16,因为编译器能够为 baz 成员使用父级的填充。

但是,如果 NotAggregate 是一个聚合(即我们添加 public: 或更改为结构体),则子项的 sizeof 更改为 24

我假设这与复制聚合的优化有关(即它可能只是完整类型的 memcpy,最终会覆盖子成员)。但这只是猜测。

谁能告诉我不允许这种优化的真正原因是什么?

https://godbolt.org/z/8jMfnnEvW

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)