微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

如果我们有这个类:

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 举报,一经查实,本站将立刻删除。