2009-07-20 63 views
2

使用gcc -fdump-class-hierarchy编译下面的类什么是“近乎空虚”的课程?

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

inline Interface::~Interface() {} 

gcc发出

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

什么是 “近空” 的意义是什么?这是什么意思?

+0

没有关系,但..不要将虚拟析构函数作为纯粹的虚拟,因为您正在提供实现。 – Naveen 2009-07-20 11:21:51

+4

我不认为这是特别好的建议。纯虚拟析构函数是说这个类是抽象类的常用简写,并且它们必须有一个实现。 – 2009-07-20 11:25:09

回答

4

C++ ABI提供的“近空”类的定义以及它们如何影响虚函数表建设一个有趣的讨论:

包含虚拟指针,A级,但除了(可能)虚基类没有其它数据。特别是,它:

  • 具有比零宽度位字段之外,没有其他的非静态数据成员,
  • 具有不或是空的,几乎是空的,或虚拟没有直接的基类,
  • 具有大多数是一个非虚拟的,几乎空的直接基类,并且
  • 没有适当的基类,它是空的,没有道德上虚拟的,并且在零以外的偏移处。

我碰到这个同时跑的研究几乎是空的虚基类的对象大小,虚函数表的大小,和虚拟调用开销的影响。

3

它只有一个vtable,没有数据字段。

6

我想这是区分它与“空”,这是你得到的,如果编译一个没有成员的类。 “几乎空虚”似乎意味着它有一个虚拟的,没有别的。

6

C++有一些叫做“空基优化”的东西。如果一个类没有成员,当它用作基类时,不需要占用空间。为什么这很重要的一个例子是std::unary_function<T, U>。它的存在是为您提供一套简单的typedefs。这些typedefs不应该影响你的函数类的大小。

如果你有一个带有vtable指针的基类,这个指针可能与派生类共享。您只需为派生类创建一个vtable,然后在基类之后添加自己的方法。

您现在可以实现类似的“无额外开销”基类。 GCC显然称之为“几乎空洞”。