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

时间:2017-12-20 21:29:02

标签: c++ inheritance constructor sizeof

我倾向于认为我对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\n", (unsigned)sizeof( Foo ), (unsigned)sizeof( Bar ) );
}

输出合理:

  

Foo:8 Bar:12

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

  

Foo:8 Bar:8

使用gcc-7.2编译

1 个答案:

答案 0 :(得分:3)

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

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

See this question了解有关ABI的详细信息。