如果基类没有成员,派生C++类的大小是多少?

Ser*_*tch 2 c++ generics size inheritance sizeof

考虑以下继承:

class Base {
protected:
  Base() { }
public:
  double Multiply(double x);
};

class Derived : public Base {
  double _value;
public:
  Derived(double init) : _value(init) { }
  double Multiply(double x) { return x*_value; }
};
Run Code Online (Sandbox Code Playgroud)

此代码段将用于模板化代码库.多态性不是一种选择,因为它添加了VTable指针,从而使内存消耗增加了一倍.

但是,我怀疑由于C++要求对象的大小至少为1个字节,因此大小Derived将变为9个字节,因此,由于填充/对齐,它将进一步变为16个字节.

那么在C++中有一种方法可以保持大小Derived等于double(通常为8个字节)的大小吗?标准说的大小是Derived什么?特别是,在这种情况下,MSVC++如何表现?

use*_*670 6

这称为空基优化,它在标准中定义如下:

1.8 C++对象模型[intro.object]

7除非它是位字段(9.2.4),否则大多数派生对象应具有非零大小,并且应占用一个或多个字节的存储空间.基类子对象可以具有零大小.平凡可复制或标准布局类型(3.9)的对象应占用连续的存储字节.

8除非对象是零字段或零大小的基类子对象,否则该对象的地址是它占用的第一个字节的地址.如果一个嵌套在另一个中,则具有不是位字段的重叠生存期的两个对象a和b可以具有相同的地址,或者如果至少一个是零大小的基类子对象并且它们具有不同类型,则它们可以具有相同的地址.否则,他们有不同的地址.

在您的示例中,继承Base类不会影响类的大小Derived.但是,MSVC++仅对第一个空基类执行此类优化,因此从添加的空基类继承将导致Derived类大小的增长.我相信这已经成为对MSVC++很长时间的批评,因为许多其他编译器都没有这个问题.如果你有很多小辅助类,这可能真的很麻烦.作为一种变通方法,可以使用派生模板基类将多重继承转换为单继承链:

class Base1
{};

template< typename TBase > class Base2: public TBase
{};

template< typename TBase > class Base3: public TBase
{};

class Derived: public Base3< Base2< Base1 > >
{};
Run Code Online (Sandbox Code Playgroud)

MS Connect错误页面.看起来他们毕竟不打算修复它.