C ++中的继承成本

时间:2010-07-06 23:30:47

标签: c++ inheritance vtable

以下面的代码为例:

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};

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

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

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

3 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:1)

是的,没有任何虚拟成员或成员变量,应该没有大小差异。

答案 2 :(得分:0)

据我所知,如果需要进行任何优化,编译器将对此进行正确优化。