c ++对象大小

ano*_*non 10 c++

假设我有:

struct Foo: public Bar {
 ....
}
Run Code Online (Sandbox Code Playgroud)

Foo没有推出新的会员变速器.Foo只介绍了一堆成员函数和静态函数.C++标准的任何部分现在都保证:

sizeof(Foo) == sizeof(Bar)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Igo*_*aka 11

我至少可以想到一个场景sizeof(Foo) != sizeof(Bar):

class Bar {
public:
 int m_member;
};

class Foo : Bar {
    virtual ~Foo();
};
Run Code Online (Sandbox Code Playgroud)

Foo将有一个vtable指针,而Bar不会和前者的大小将是一个更大的单词Bar.在32位DEBUG MSVC2010上:

sizeof(Foo) - 8
sizeof(Bar) - 4
Run Code Online (Sandbox Code Playgroud)

编辑这适用于结构和类,我重新测试以确认.

  • 在C++中,struct和class之间的唯一区别是默认访问范围. - 添加一个,即使它并不重要,语言要求您始终引用相同的构造.你不能声明"class Foo",然后是"struct Foo".至少,如果你这样做,它将假设它们是相同的并且(通常)警告不一致的声明. (5认同)
  • @Betamoo:C++没有"结构".一切都是一个类,即使它是用`struct`关键字声明的. (3认同)

Chr*_*odd 5

是的 - 如果它们是POD类型.如果POD类型具有相同顺序的布局兼容成员,则可以保证POD类型与布局兼容(即,您可以从一个到另一个进行memcpy).由于子类自动使其所有基类的成员具有相同的顺序,并且在这种情况下没有其他成员,因此它们将是布局兼容的,因此大小相同.见规范9.3节.

请注意,为了成为POD类型,它们必须没有虚函数(除其他要求外)

编辑

最新的标准草案将POD类型的要求分为两组:普通类和标准布局类. POD类是那些既简单标准的布局,我相信你想要的大小只是标准的布局 - 它们也不一定是微不足道的(因而也就是POD)类.规范中标准布局的要求是:

一个标准的布局类是一类:

- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,

- 没有虚函数(10.3),没有虚基类(10.1),

- 对所有非静态数据成员具有相同的访问控制(第11条),

- 没有非标准布局基类,

- 在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且

- 没有与第一个非静态数据成员相同类型的基类.108