C++中的继承成本

chr*_*sph 9 c++ inheritance vtable

以下面的代码片段为例:

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};
Run Code Online (Sandbox Code Playgroud)

如您所见,此关系中不存在虚函数.既然如此,就语言而言,以下假设是否准确?

  • 不会创建虚拟功能表Bar.
  • sizeof(Bar) == sizeof(Baz)

基本上,我正在试图弄清楚我是否会为此付出任何代价.我的初始测试(虽然在单个编译器上)表明我的断言是有效的,但我不确定这是我的编译器的优化器还是对我所看到的负责的语言规范.

Bil*_*eal 10

根据标准,Bar不是POD(普通旧数据)类型,因为它有一个基础.因此,该标准为C++编译器提供了与这种类型相同的宽范围.

但是,很少有编译器会在这里做任何疯狂的事情.您可能需要注意的一件事是空基优化.由于各种技术原因,C++标准要求为任何实例分配存储空间.对于某些编译器,Foo将在bar类中分配专用空间.但是,实现空基优化的编译器(大部分都是现代使用的)将删除空基.

如果给定的编译器没有实现EBO,那么sizeof(foo)将至少两次sizeof(baz).