编制以下类

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

使用 gcc -fdump-class-hierarchy.

gcc 发射

Class Interface
   size=4 align=4
   base size=4 base align=4
Interface (0x1a779c0) 0 nearly-empty
    vptr=((& Interface::_ZTV9Interface) + 8u)

意义是什么"几乎空"?这是什么意思?

有帮助吗?

解决方案

C++ABI 提供了一个定义的"几乎是空的"类和一个有趣的讨论它们如何影响虚表建设:

一类,它包含一个虚拟的指针,但没有其他数据外(可能的)虚拟基础。其中特别:

  • 没有非静态数据的其他成员于零宽bitfields,
  • 没有直接的基本课,是不是空的,几乎是空的,或者是虚拟的,
  • 具有至多一个非虚拟的,几乎是空的直接基类,
  • 没有适当的基类是空的,不道德上虚拟的,并在一个偏移等于零。

我跑过这个,同时研究的效果几乎空虚的基础上目尺寸、虚表的大小,以及虚拟叫开销。

其他提示

我想这是从“空”区分开来,这是你所得到的,如果在所有不带任何成员编译的类。 “近空”似乎意味着它公会VTABLE,别无其他。

C ++有一种叫做“空基地优化”。如果一个类没有成员,它并不需要的时候它被用来作为基类占用空间。为什么这是很重要的一个例子是std::unary_function<T, U>。它的存在,为您提供一个简单的typedef集的。这些类型定义不应该有助于你的函数子类的大小。

如果你有一个虚函数表指针的基类,该指针可以容易地与派生类共享。您只需创建派生类后基类中增加了它自己的方法一个虚函数表。

您现在可以实现类似“没有额外的开销”基类。显然,GCC调用 “几乎是空的。”

它只有一个虚函数表,没有数据域。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top