将默认构造函数添加到基类会更改sizeof()派生类型[duplicate]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将默认构造函数添加到基类会更改sizeof()派生类型[duplicate]相关的知识,希望对你有一定的参考价值。

我倾向于认为我对C ++内部和内存布局有很好的把握,但这个让我感到困惑。我有以下测试代码:

#include <stdio.h>

struct Foo
{
    //Foo() {}
    int x;
    char y;
};

struct Bar : public Foo
{
    char z[3];
};

int main()
{
    printf( "Foo: %u Bar: %u
", (unsigned)sizeof( Foo ), (unsigned)sizeof( Bar ) );
}

输出是合理的:

Foo:8 Bar:12

但是,这是非常奇怪的部分,如果我取消注释Foo()上的简单默认构造函数,sizeof(Bar)会发生变化!如何添加ctor可能会改变这些类的内存布局?

Foo:8 Bar:8

使用gcc-7.2编译

答案

GCC遵循用于C ++的Itanium ABI,它阻止了用于存储派生类数据成员的POD的尾部填充。

添加用户提供的构造函数意味着Foo不再是POD,因此该限制不适用于Bar

See this question了解ABI的更多细节。

以上是关于将默认构造函数添加到基类会更改sizeof()派生类型[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

使用 autofac 将构造函数注入到基类中

将共享指针的派生类切换到基类

派生类的构造函数

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

将 PropertyChangedCallback 添加到基类的只读依赖属性