什么是“几乎空”的课程?

时间:2009-07-20 11:14:26

标签: c++ gcc abc

编译以下类

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)

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

4 个答案:

答案 0 :(得分:6)

我想将它与“空”区分开来,如果编译一个完全没有成员的类,你就会得到它。 “几乎是空的”似乎意味着它有一个vtable,没有别的。

答案 1 :(得分:6)

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

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

您现在可以实现类似的“无额外开销”基类。显然,海湾合作委员会称“几乎是空的”。

答案 2 :(得分:4)

C++ ABI提供了“几乎空”类的定义,以及它们如何影响vtable构造的有趣讨论:

  

包含虚拟指针的类,但除了(可能)虚拟基础之外没有其他数据。特别是:

     
      
  • 除零宽度位域外没有非静态数据成员
  •   
  • 没有直接的基类,它们既不是空的,也不是空的,或者是虚拟的,
  •   
  • 最多只有一个非虚拟,几乎为空的直接基类,
  •   
  • 没有适当的基类,它是空的,不是道德虚拟的,并且在零以外的偏移处。
  •   

我在研究几乎空的虚拟基础对对象大小,vtable大小和虚拟呼叫开销的影响时遇到了这个问题。

答案 3 :(得分:3)

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