以下面的代码为例:
struct Foo
{
typedef int type;
};
class Bar : private Foo
{
};
class Baz
{
};
如您所见,此关系中不存在虚函数。既然如此,就语言而言,以下假设是否准确?
Bar
。sizeof(Bar) == sizeof(Baz)
基本上,我正在试图弄清楚我是否会为此付出任何代价。我的初始测试(虽然在单个编译器上)表明我的断言是有效的,但我不确定这是我的编译器的优化器还是负责我所看到的语言规范。
答案 0 :(得分:10)
根据标准,Bar不是POD(普通旧数据)类型,因为它有一个基础。因此,该标准为C ++编译器提供了与这种类型相同的宽范围。
但是,很少有编译器会在这里做任何疯狂的事情。您可能需要注意的一件事是空基优化。由于各种技术原因,C ++标准要求为任何实例分配存储空间。对于某些编译器,Foo将在bar
类中分配专用空间。然而,实现空基优化的编译器(现在大多数都是现代使用的)将删除空基。
如果给定的编译器没有实现EBO,那么sizeof(foo)
将至少两次sizeof(baz)
。
答案 1 :(得分:1)
是的,没有任何虚拟成员或成员变量,应该没有大小差异。
答案 2 :(得分:0)
据我所知,如果需要进行任何优化,编译器将对此进行正确优化。