9

以下面的代码片段为例:

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};

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

  • 不会创建虚函数表Bar
  • sizeof(Bar) == sizeof(Baz)

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

4

3 回答 3

10

根据标准,Bar 不是 POD(plain old data)类型,因为它有一个基础。因此,该标准为 C++ 编译器提供了使用此类类型的广泛范围。

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

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

于 2010-07-06T23:43:46.430 回答
1

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

于 2010-07-06T23:35:44.303 回答
0

据我所知,如果需要任何优化,编译器会正确优化。

于 2010-07-06T23:43:13.687 回答